aboutsummaryrefslogtreecommitdiff
path: root/applications/threadx_demo/tx_initialize_low_level.c
diff options
context:
space:
mode:
Diffstat (limited to 'applications/threadx_demo/tx_initialize_low_level.c')
-rw-r--r--applications/threadx_demo/tx_initialize_low_level.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/applications/threadx_demo/tx_initialize_low_level.c b/applications/threadx_demo/tx_initialize_low_level.c
new file mode 100644
index 0000000..f709cb2
--- /dev/null
+++ b/applications/threadx_demo/tx_initialize_low_level.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/****************************************************************************
+ * Includes
+ ****************************************************************************/
+#include "tx_api.h"
+#include <stdio.h>
+
+/****************************************************************************
+ * Defines
+ ****************************************************************************/
+#define SYSTEM_CLOCK 6000000
+#define SYSTICK_CYCLES ((SYSTEM_CLOCK / 100) - 1)
+
+/****************************************************************************
+ * Externs
+ ****************************************************************************/
+void _tx_timer_interrupt(void);
+
+/****************************************************************************
+ * Functions
+ ****************************************************************************/
+
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_initialize_low_level Cortex-M4/GNU */
+/* 6.1 */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for any low-level processor */
+/* initialization, including setting up interrupt vectors, setting */
+/* up a periodic timer interrupt source, saving the system stack */
+/* pointer for use in ISR processing later, and finding the first */
+/* available RAM memory address for tx_application_define. */
+/* this function has an empty implementation in this example. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* _tx_initialize_kernel_enter ThreadX entry function */
+/* */
+/**************************************************************************/
+VOID _tx_initialize_low_level(VOID) {
+ __asm__ volatile(
+ /* Disable interrupts during ThreadX initialization. */
+ " CPSID i\n"
+ /* Enable the cycle count register. */
+ " LDR r0, =0xE0001000\n" // Build address of DWT register
+ " LDR r1, [r0]\n" // Pickup the current value
+ " ORR r1, r1, #1\n" // Set the CYCCNTENA bit
+ " STR r1, [r0]\n" // Enable the cycle count register
+ /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */
+ " MOV r0, #0xE000E000\n" // Build address of NVIC registers
+ " LDR r1, =59999\n" // 59,999 = SYSTICK_CYCLES = ((6,000,000 / 100) -1)
+ " STR r1, [r0, #0x14]\n" // Setup SysTick Reload Value
+ " MOV r1, #0x7\n" // Build SysTick Control Enable Value
+ " STR r1, [r0, #0x10]\n" // Setup SysTick Control
+ /* Configure handler priorities. */
+ " LDR r1, =0x00000000\n" // Rsrv, UsgF, BusF, MemM
+ " STR r1, [r0, #0xD18]\n" // Setup System Handlers 4-7 Priority Registers
+ " LDR r1, =0xFF000000\n" // SVCl, Rsrv, Rsrv, Rsrv
+ " STR r1, [r0, #0xD1C]\n" // Setup System Handlers 8-11 Priority Registers
+ // Note: SVC must be lowest priority, which is 0xFF
+ " LDR r1, =0x40FF0000\n" // SysT, PnSV, Rsrv, DbgM
+ " STR r1, [r0, #0xD20]\n" // Setup System Handlers 12-15 Priority Registers
+ // Note: PnSV must be lowest priority, which is 0xFF
+ /* Return to caller. */
+ " BX lr\n");
+}
+
+/* SysTick_Handler has a generic interrupt handler template. */
+/* to implement a new handler, replace the call to */
+/* _tx_timer_interrupt to some other c function */
+VOID SysTick_Handler(VOID) {
+#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
+ _tx_execution_isr_enter(); // Call the ISR enter function
+#endif
+
+ _tx_timer_interrupt();
+
+#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
+ _tx_execution_isr_exit(); // Call the ISR exit function
+#endif
+
+ return;
+}