generated from Template/H563ZI-HAL-CMake-Template
	开启 ThreadX
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build and Upload Artifact / build and upload-artifact (push) Successful in 25m8s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build and Upload Artifact / build and upload-artifact (push) Successful in 25m8s
				
			This commit is contained in:
		
							
								
								
									
										91
									
								
								Core/Src/app_threadx.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								Core/Src/app_threadx.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    app_threadx.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   ThreadX applicative file | ||||
|   ****************************************************************************** | ||||
|     * @attention | ||||
|   * | ||||
|   * Copyright (c) 2025 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "app_threadx.h" | ||||
|  | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
|  | ||||
| /* USER CODE END Includes */ | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PTD */ | ||||
|  | ||||
| /* USER CODE END PTD */ | ||||
|  | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PD */ | ||||
|  | ||||
| /* USER CODE END PD */ | ||||
|  | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PM */ | ||||
|  | ||||
| /* USER CODE END PM */ | ||||
|  | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
|  | ||||
| /* USER CODE END PV */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* USER CODE BEGIN PFP */ | ||||
|  | ||||
| /* USER CODE END PFP */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Application ThreadX Initialization. | ||||
|   * @param memory_ptr: memory pointer | ||||
|   * @retval int | ||||
|   */ | ||||
| UINT App_ThreadX_Init(VOID *memory_ptr) | ||||
| { | ||||
|   UINT ret = TX_SUCCESS; | ||||
|   /* USER CODE BEGIN App_ThreadX_MEM_POOL */ | ||||
|  | ||||
|   /* USER CODE END App_ThreadX_MEM_POOL */ | ||||
|   /* USER CODE BEGIN App_ThreadX_Init */ | ||||
|   /* USER CODE END App_ThreadX_Init */ | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
|   /** | ||||
|   * @brief  Function that implements the kernel's initialization. | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void MX_ThreadX_Init(void) | ||||
| { | ||||
|   /* USER CODE BEGIN Before_Kernel_Start */ | ||||
|  | ||||
|   /* USER CODE END Before_Kernel_Start */ | ||||
|  | ||||
|   tx_kernel_enter(); | ||||
|  | ||||
|   /* USER CODE BEGIN Kernel_Start_Error */ | ||||
|  | ||||
|   /* USER CODE END Kernel_Start_Error */ | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN 1 */ | ||||
|  | ||||
| /* USER CODE END 1 */ | ||||
| @@ -17,6 +17,7 @@ | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "app_threadx.h" | ||||
| #include "main.h" | ||||
| #include "memorymap.h" | ||||
| #include "tim.h" | ||||
| @@ -95,6 +96,8 @@ int main(void) | ||||
|  | ||||
|   /* USER CODE END 2 */ | ||||
|  | ||||
|   MX_ThreadX_Init(); | ||||
|  | ||||
|   /* Initialize leds */ | ||||
|   BSP_LED_Init(LED_GREEN); | ||||
|   BSP_LED_Init(LED_YELLOW); | ||||
| @@ -114,6 +117,8 @@ int main(void) | ||||
|     Error_Handler(); | ||||
|   } | ||||
|  | ||||
|   /* We should never get here as control is now taken by the scheduler */ | ||||
|  | ||||
|   /* Infinite loop */ | ||||
|   /* USER CODE BEGIN WHILE */ | ||||
|   AppStart(); | ||||
| @@ -187,6 +192,28 @@ void SystemClock_Config(void) | ||||
|  | ||||
| /* USER CODE END 4 */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Period elapsed callback in non blocking mode | ||||
|   * @note   This function is called  when TIM1 interrupt took place, inside | ||||
|   * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment | ||||
|   * a global variable "uwTick" used as application time base. | ||||
|   * @param  htim : TIM handle | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | ||||
| { | ||||
|   /* USER CODE BEGIN Callback 0 */ | ||||
|  | ||||
|   /* USER CODE END Callback 0 */ | ||||
|   if (htim->Instance == TIM1) | ||||
|   { | ||||
|     HAL_IncTick(); | ||||
|   } | ||||
|   /* USER CODE BEGIN Callback 1 */ | ||||
|  | ||||
|   /* USER CODE END Callback 1 */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function is executed in case of error occurrence. | ||||
|   * @retval None | ||||
|   | ||||
							
								
								
									
										126
									
								
								Core/Src/stm32h5xx_hal_timebase_tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								Core/Src/stm32h5xx_hal_timebase_tim.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| /* USER CODE BEGIN Header */ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32h5xx_hal_timebase_tim.c | ||||
|   * @brief   HAL time base based on the hardware TIM. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2025 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* USER CODE END Header */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32h5xx_hal.h" | ||||
| #include "stm32h5xx_hal_tim.h" | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| TIM_HandleTypeDef        htim1; | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function configures the TIM1 as a time base source. | ||||
|   *         The time source is configured  to have 1ms time base with a dedicated | ||||
|   *         Tick interrupt priority. | ||||
|   * @note   This function is called  automatically at the beginning of program after | ||||
|   *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). | ||||
|   * @param  TickPriority: Tick interrupt priority. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) | ||||
| { | ||||
|   RCC_ClkInitTypeDef    clkconfig; | ||||
|   uint32_t              uwTimclock; | ||||
|   uint32_t              uwPrescalerValue; | ||||
|   uint32_t              pFLatency; | ||||
|  | ||||
|   HAL_StatusTypeDef     status; | ||||
|  | ||||
|   /* Enable TIM1 clock */ | ||||
|   __HAL_RCC_TIM1_CLK_ENABLE(); | ||||
|  | ||||
|   /* Get clock configuration */ | ||||
|   HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); | ||||
|  | ||||
|   /* Compute TIM1 clock */ | ||||
|       uwTimclock = HAL_RCC_GetPCLK2Freq(); | ||||
|  | ||||
|   /* Compute the prescaler value to have TIM1 counter clock equal to 100KHz */ | ||||
|   uwPrescalerValue = (uint32_t) ((uwTimclock / 100000U) - 1U); | ||||
|  | ||||
|   /* Initialize TIM1 */ | ||||
|   htim1.Instance = TIM1; | ||||
|  | ||||
|   /* Initialize TIMx peripheral as follow: | ||||
|    * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. | ||||
|    * Prescaler = (uwTimclock/100000 - 1) to have a 100KHz counter clock. | ||||
|    * ClockDivision = 0 | ||||
|    * Counter direction = Up | ||||
|    */ | ||||
|   htim1.Init.Period = (100000U / 1000U) - 1U; | ||||
|   htim1.Init.Prescaler = uwPrescalerValue; | ||||
|   htim1.Init.ClockDivision = 0; | ||||
|   htim1.Init.CounterMode = TIM_COUNTERMODE_UP; | ||||
|  | ||||
|   status = HAL_TIM_Base_Init(&htim1); | ||||
|   if (status == HAL_OK) | ||||
|   { | ||||
|     /* Start the TIM time Base generation in interrupt mode */ | ||||
|     status = HAL_TIM_Base_Start_IT(&htim1); | ||||
|     if (status == HAL_OK) | ||||
|     { | ||||
|       if (TickPriority < (1UL << __NVIC_PRIO_BITS)) | ||||
|       { | ||||
|         /* Enable the TIM1 global Interrupt */ | ||||
|         HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority, 0U); | ||||
|         uwTickPrio = TickPriority; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         status = HAL_ERROR; | ||||
|       } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   /* Enable the TIM1 global Interrupt */ | ||||
|   HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Suspend Tick increment. | ||||
|   * @note   Disable the tick increment by disabling TIM1 update interrupt. | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_SuspendTick(void) | ||||
| { | ||||
|   /* Disable TIM1 update Interrupt */ | ||||
|   __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Resume Tick increment. | ||||
|   * @note   Enable the tick increment by Enabling TIM1 update interrupt. | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_ResumeTick(void) | ||||
| { | ||||
|   /* Enable TIM1 Update interrupt */ | ||||
|   __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); | ||||
| } | ||||
|  | ||||
| @@ -55,6 +55,7 @@ | ||||
| /* USER CODE END 0 */ | ||||
|  | ||||
| /* External variables --------------------------------------------------------*/ | ||||
| extern TIM_HandleTypeDef htim1; | ||||
|  | ||||
| /* USER CODE BEGIN EV */ | ||||
|  | ||||
| @@ -138,19 +139,6 @@ void UsageFault_Handler(void) | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles System service call via SWI instruction. | ||||
|   */ | ||||
| void SVC_Handler(void) | ||||
| { | ||||
|   /* USER CODE BEGIN SVCall_IRQn 0 */ | ||||
|  | ||||
|   /* USER CODE END SVCall_IRQn 0 */ | ||||
|   /* USER CODE BEGIN SVCall_IRQn 1 */ | ||||
|  | ||||
|   /* USER CODE END SVCall_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles Debug monitor. | ||||
|   */ | ||||
| @@ -164,33 +152,6 @@ void DebugMon_Handler(void) | ||||
|   /* USER CODE END DebugMonitor_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles Pendable request for system service. | ||||
|   */ | ||||
| void PendSV_Handler(void) | ||||
| { | ||||
|   /* USER CODE BEGIN PendSV_IRQn 0 */ | ||||
|  | ||||
|   /* USER CODE END PendSV_IRQn 0 */ | ||||
|   /* USER CODE BEGIN PendSV_IRQn 1 */ | ||||
|  | ||||
|   /* USER CODE END PendSV_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles System tick timer. | ||||
|   */ | ||||
| void SysTick_Handler(void) | ||||
| { | ||||
|   /* USER CODE BEGIN SysTick_IRQn 0 */ | ||||
|  | ||||
|   /* USER CODE END SysTick_IRQn 0 */ | ||||
|   HAL_IncTick(); | ||||
|   /* USER CODE BEGIN SysTick_IRQn 1 */ | ||||
|  | ||||
|   /* USER CODE END SysTick_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /******************************************************************************/ | ||||
| /* STM32H5xx Peripheral Interrupt Handlers                                    */ | ||||
| /* Add here the Interrupt Handlers for the used peripherals.                  */ | ||||
| @@ -212,6 +173,20 @@ void EXTI13_IRQHandler(void) | ||||
|   /* USER CODE END EXTI13_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles TIM1 Update interrupt. | ||||
|   */ | ||||
| void TIM1_UP_IRQHandler(void) | ||||
| { | ||||
|   /* USER CODE BEGIN TIM1_UP_IRQn 0 */ | ||||
|  | ||||
|   /* USER CODE END TIM1_UP_IRQn 0 */ | ||||
|   HAL_TIM_IRQHandler(&htim1); | ||||
|   /* USER CODE BEGIN TIM1_UP_IRQn 1 */ | ||||
|  | ||||
|   /* USER CODE END TIM1_UP_IRQn 1 */ | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN 1 */ | ||||
|  | ||||
| /* USER CODE END 1 */ | ||||
|   | ||||
							
								
								
									
										643
									
								
								Core/Src/tx_initialize_low_level.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										643
									
								
								Core/Src/tx_initialize_low_level.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,643 @@ | ||||
|  | ||||
| // by default AzureRTOS is configured to use static byte pool for | ||||
| // allocation, in case dynamic allocation is to be used, uncomment | ||||
| // the define below and update the linker files to define the following symbols | ||||
| // EWARM toolchain: | ||||
| //       place in RAM_region    { last section FREE_MEM}; | ||||
| // MDK-ARM toolchain; | ||||
| //       either define the RW_IRAM1 region in the ".sct" file or modify this file by referring to the correct memory region. | ||||
| //         LDR r1, =|Image$$RW_IRAM1$$ZI$$Limit| | ||||
| // STM32CubeIDE toolchain: | ||||
| //       ._threadx_heap : | ||||
| //       { | ||||
| //        . = ALIGN(8); | ||||
| //        __RAM_segment_used_end__ = .; | ||||
| //        . = . + 64K; | ||||
| //        . = ALIGN(8); | ||||
| //       } >RAM_D1 AT> RAM_D1 | ||||
| //  The simplest way to provide memory for ThreadX is to define a new section, see ._threadx_heap above. | ||||
| //  In the example above the ThreadX heap size is set to 64KBytes. | ||||
| //  The ._threadx_heap must be located between the .bss and the ._user_heap_stack sections in the linker script. | ||||
| //  Caution: Make sure that ThreadX does not need more than the provided heap memory (64KBytes in this example). | ||||
| //  Read more in STM32CubeIDE User Guide, chapter: "Linker script". | ||||
|  | ||||
| //#define USE_DYNAMIC_MEMORY_ALLOCATION | ||||
|  | ||||
| #if defined (__clang__) | ||||
| /**************************************************************************/ | ||||
| /*                                                                        */ | ||||
| /*       Copyright (c) Microsoft Corporation. All rights reserved.        */ | ||||
| /*                                                                        */ | ||||
| /*       This software is licensed under the Microsoft Software License   */ | ||||
| /*       Terms for Microsoft Azure RTOS. Full text of the license can be  */ | ||||
| /*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */ | ||||
| /*       and in the root directory of this software.                      */ | ||||
| /*                                                                        */ | ||||
| /**************************************************************************/ | ||||
|  | ||||
| /**************************************************************************/ | ||||
| /**************************************************************************/ | ||||
| /**                                                                       */ | ||||
| /** ThreadX Component                                                     */ | ||||
| /**                                                                       */ | ||||
| /**   Initialize                                                          */ | ||||
| /**                                                                       */ | ||||
| /**************************************************************************/ | ||||
| /**************************************************************************/ | ||||
|  | ||||
| SYSTEM_CLOCK      =   250000000 | ||||
| SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1) | ||||
|  | ||||
| /**************************************************************************/ | ||||
| /*                                                                        */ | ||||
| /*  FUNCTION                                               RELEASE        */ | ||||
| /*                                                                        */ | ||||
| /*    _tx_initialize_low_level                          Cortex-M33/AC6    */ | ||||
| /*                                                           6.1          */ | ||||
| /*  AUTHOR                                                                */ | ||||
| /*                                                                        */ | ||||
| /*    Scott Larson, Microsoft Corporation                                 */ | ||||
| /*                                                                        */ | ||||
| /*  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.             */ | ||||
| /*                                                                        */ | ||||
| /*  INPUT                                                                 */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  OUTPUT                                                                */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  CALLS                                                                 */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  CALLED BY                                                             */ | ||||
| /*                                                                        */ | ||||
| /*    _tx_initialize_kernel_enter           ThreadX entry function        */ | ||||
| /*                                                                        */ | ||||
| /*  RELEASE HISTORY                                                       */ | ||||
| /*                                                                        */ | ||||
| /*    DATE              NAME                      DESCRIPTION             */ | ||||
| /*                                                                        */ | ||||
| /*  09-30-2020      Scott Larson            Initial Version 6.1           */ | ||||
| /*                                                                        */ | ||||
| /**************************************************************************/ | ||||
| // VOID   _tx_initialize_low_level(VOID) | ||||
| // { | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  _tx_initialize_low_level | ||||
|     .thumb_func | ||||
| .type _tx_initialize_low_level, function | ||||
| _tx_initialize_low_level: | ||||
|  | ||||
|     /* Disable interrupts during ThreadX initialization.  */ | ||||
|     CPSID   i | ||||
|  | ||||
|     /* Set base of available memory to end of non-initialised RAM area.  */ | ||||
| #ifdef USE_DYNAMIC_MEMORY_ALLOCATION | ||||
|     LDR     r0, =_tx_initialize_unused_memory       // Build address of unused memory pointer | ||||
|     LDR     r1, =Image$$RW_IRAM1$$ZI$$Limit         // Build first free address | ||||
|     ADD     r1, r1, #4                              // | ||||
|     STR     r1, [r0]                                // Setup first unused memory pointer | ||||
| #endif | ||||
|  | ||||
|     /* Setup Vector Table Offset Register.  */ | ||||
|     MOV     r0, #0xE000E000                         // Build address of NVIC registers | ||||
|     LDR     r1, =__Vectors                          // Pickup address of vector table | ||||
|     STR     r1, [r0, #0xD08]                        // Set vector table address | ||||
|  | ||||
|     /* Enable the cycle count register.  */ | ||||
|     LDR     r0, =0xE0001000                         // Build address of DWT register | ||||
|     LDR     r1, [r0]                                // Pickup the current value | ||||
|     ORR     r1, r1, #1                              // Set the CYCCNTENA bit | ||||
|     STR     r1, [r0]                                // Enable the cycle count register | ||||
|  | ||||
|     /* Set system stack pointer from vector value.  */ | ||||
|     LDR     r0, =_tx_thread_system_stack_ptr        // Build address of system stack pointer | ||||
|     LDR     r1, =__Vectors                          // Pickup address of vector table | ||||
|     LDR     r1, [r1]                                // Pickup reset stack pointer | ||||
|     STR     r1, [r0]                                // Save system stack pointer | ||||
|  | ||||
|     /* Configure SysTick.  */ | ||||
|     MOV     r0, #0xE000E000                         // Build address of NVIC registers | ||||
|     LDR     r1, =SYSTICK_CYCLES | ||||
|     STR     r1, [r0, #0x14]                         // Setup SysTick Reload Value | ||||
|     MOV     r1, #0x7                                // Build SysTick Control Enable Value | ||||
|     STR     r1, [r0, #0x10]                         // Setup SysTick Control | ||||
|  | ||||
|     /* Configure handler priorities.  */ | ||||
|     LDR     r1, =0x00000000                         // Rsrv, UsgF, BusF, MemM | ||||
|     STR     r1, [r0, #0xD18]                        // Setup System Handlers 4-7 Priority Registers | ||||
|  | ||||
|     LDR     r1, =0xFF000000                         // SVCl, Rsrv, Rsrv, Rsrv | ||||
|     STR     r1, [r0, #0xD1C]                        // Setup System Handlers 8-11 Priority Registers | ||||
|                                                     // Note: SVC must be lowest priority, which is 0xFF | ||||
|  | ||||
|     LDR     r1, =0x40FF0000                         // SysT, PnSV, Rsrv, DbgM | ||||
|     STR     r1, [r0, #0xD20]                        // Setup System Handlers 12-15 Priority Registers | ||||
|                                                     // Note: PnSV must be lowest priority, which is 0xFF | ||||
|  | ||||
|     /* Return to caller.  */ | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
| /* Define shells for each of the unused vectors.  */ | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_BadHandler | ||||
|     .thumb_func | ||||
| .type __tx_BadHandler, function | ||||
| __tx_BadHandler: | ||||
|     B       __tx_BadHandler | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_IntHandler | ||||
|     .thumb_func | ||||
| .type __tx_IntHandler, function | ||||
| __tx_IntHandler: | ||||
| // VOID InterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     /* Do interrupt handler work here */ | ||||
|     /* .... */ | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      LR | ||||
| // } | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  SysTick_Handler | ||||
|     .thumb_func | ||||
| .type SysTick_Handler, function | ||||
| SysTick_Handler: | ||||
| // VOID TimerInterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     BL      _tx_timer_interrupt | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      LR | ||||
| // } | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_NMIHandler | ||||
|     .thumb_func | ||||
| .type __tx_NMIHandler, function | ||||
| __tx_NMIHandler: | ||||
|     B       __tx_NMIHandler | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_DBGHandler | ||||
|     .thumb_func | ||||
| .type __tx_DBGHandler, function | ||||
| __tx_DBGHandler: | ||||
|     B       __tx_DBGHandler | ||||
|  | ||||
|     .end | ||||
| #endif | ||||
|  | ||||
| #if defined(__IAR_SYSTEMS_ASM__) | ||||
| ;/**************************************************************************/ | ||||
| ;/*                                                                        */ | ||||
| ;/*       Copyright (c) Microsoft Corporation. All rights reserved.        */ | ||||
| ;/*                                                                        */ | ||||
| ;/*       This software is licensed under the Microsoft Software License   */ | ||||
| ;/*       Terms for Microsoft Azure RTOS. Full text of the license can be  */ | ||||
| ;/*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */ | ||||
| ;/*       and in the root directory of this software.                      */ | ||||
| ;/*                                                                        */ | ||||
| ;/**************************************************************************/ | ||||
| ; | ||||
| ; | ||||
| ;/**************************************************************************/ | ||||
| ;/**************************************************************************/ | ||||
| ;/**                                                                       */ | ||||
| ;/** ThreadX Component                                                     */ | ||||
| ;/**                                                                       */ | ||||
| ;/**   Initialize                                                          */ | ||||
| ;/**                                                                       */ | ||||
| ;/**************************************************************************/ | ||||
| ;/**************************************************************************/ | ||||
| ; | ||||
| ; | ||||
|     EXTERN  _tx_thread_system_stack_ptr | ||||
|     EXTERN  _tx_initialize_unused_memory | ||||
|     EXTERN  _tx_timer_interrupt | ||||
|     EXTERN  _tx_execution_isr_enter | ||||
|     EXTERN  _tx_execution_isr_exit | ||||
|     EXTERN  __vector_table | ||||
| ; | ||||
| ; | ||||
| SYSTEM_CLOCK      EQU   250000000 | ||||
| SYSTICK_CYCLES    EQU   ((SYSTEM_CLOCK / 100) -1) | ||||
| ; | ||||
| ; | ||||
|  | ||||
| #ifdef USE_DYNAMIC_MEMORY_ALLOCATION | ||||
|     RSEG    FREE_MEM:DATA | ||||
|     PUBLIC  __tx_free_memory_start | ||||
| __tx_free_memory_start | ||||
|     DS32    4 | ||||
| #endif | ||||
| ; | ||||
| ; | ||||
|     SECTION `.text`:CODE:NOROOT(2) | ||||
|     THUMB | ||||
|  | ||||
| ;/**************************************************************************/ | ||||
| ;/*                                                                        */ | ||||
| ;/*  FUNCTION                                               RELEASE        */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    _tx_initialize_low_level                          Cortex-M33/IAR    */ | ||||
| ;/*                                                           6.1          */ | ||||
| ;/*  AUTHOR                                                                */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    Scott Larson, Microsoft Corporation                                 */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  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.             */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  INPUT                                                                 */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    None                                                                */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  OUTPUT                                                                */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    None                                                                */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  CALLS                                                                 */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    None                                                                */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  CALLED BY                                                             */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    _tx_initialize_kernel_enter           ThreadX entry function        */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  RELEASE HISTORY                                                       */ | ||||
| ;/*                                                                        */ | ||||
| ;/*    DATE              NAME                      DESCRIPTION             */ | ||||
| ;/*                                                                        */ | ||||
| ;/*  09-30-2020      Scott Larson            Initial Version 6.1           */ | ||||
| ;/*                                                                        */ | ||||
| ;/**************************************************************************/ | ||||
| ;VOID   _tx_initialize_low_level(VOID) | ||||
| ;{ | ||||
|     PUBLIC  _tx_initialize_low_level | ||||
| _tx_initialize_low_level: | ||||
| ; | ||||
| ;    /* Disable interrupts during ThreadX initialization.  */ | ||||
| ; | ||||
|     CPSID   i | ||||
| ; | ||||
| ;    /* Set base of available memory to end of non-initialised RAM area.  */ | ||||
| ; | ||||
| #ifdef USE_DYNAMIC_MEMORY_ALLOCATION | ||||
|     LDR     r0, =_tx_initialize_unused_memory       ; Build address of unused memory pointer | ||||
|     LDR     r1, =__tx_free_memory_start             ; Build first free address | ||||
|     STR     r1, [r0]                                ; Setup first unused memory pointer | ||||
| #endif | ||||
| ; | ||||
| ;    /* Setup Vector Table Offset Register.  */ | ||||
| ; | ||||
|     MOV     r0, #0xE000E000                         ; Build address of NVIC registers | ||||
|     LDR     r1, =__vector_table                     ; Pickup address of vector table | ||||
|     STR     r1, [r0, #0xD08]                        ; Set vector table address | ||||
| ; | ||||
| ;    /* Enable the cycle count register.  */ | ||||
| ; | ||||
| ;    LDR     r0, =0xE0001000                         ; Build address of DWT register | ||||
| ;    LDR     r1, [r0]                                ; Pickup the current value | ||||
| ;    ORR     r1, r1, #1                              ; Set the CYCCNTENA bit | ||||
| ;    STR     r1, [r0]                                ; Enable the cycle count register | ||||
| ; | ||||
| ;    /* Set system stack pointer from vector value.  */ | ||||
| ; | ||||
|     LDR     r0, =_tx_thread_system_stack_ptr        ; Build address of system stack pointer | ||||
|     LDR     r1, =__vector_table                     ; Pickup address of vector table | ||||
|     LDR     r1, [r1]                                ; Pickup reset stack pointer | ||||
|     STR     r1, [r0]                                ; Save system stack pointer | ||||
| ; | ||||
| ;    /* Configure SysTick.  */ | ||||
| ; | ||||
|     MOV     r0, #0xE000E000                         ; Build address of NVIC registers | ||||
|     LDR     r1, =SYSTICK_CYCLES | ||||
|     STR     r1, [r0, #0x14]                         ; Setup SysTick Reload Value | ||||
|     MOV     r1, #0x7                                ; Build SysTick Control Enable Value | ||||
|     STR     r1, [r0, #0x10]                         ; Setup SysTick Control | ||||
| ; | ||||
| ;    /* Configure handler priorities.  */ | ||||
| ; | ||||
|     LDR     r1, =0x00000000                         ; Rsrv, UsgF, BusF, MemM | ||||
|     STR     r1, [r0, #0xD18]                        ; Setup System Handlers 4-7 Priority Registers | ||||
|  | ||||
|     LDR     r1, =0xFF000000                         ; SVCl, Rsrv, Rsrv, Rsrv | ||||
|     STR     r1, [r0, #0xD1C]                        ; Setup System Handlers 8-11 Priority Registers | ||||
|                                                     ; Note: SVC must be lowest priority, which is 0xFF | ||||
|  | ||||
|     LDR     r1, =0x40FF0000                         ; SysT, PnSV, Rsrv, DbgM | ||||
|     STR     r1, [r0, #0xD20]                        ; Setup System Handlers 12-15 Priority Registers | ||||
|                                                     ; Note: PnSV must be lowest priority, which is 0xFF | ||||
| ; | ||||
| ;    /* Return to caller.  */ | ||||
| ; | ||||
|     BX      lr | ||||
| ;} | ||||
| ; | ||||
| ; | ||||
| ;/* Define shells for each of the unused vectors.  */ | ||||
| ; | ||||
|     PUBLIC  __tx_BadHandler | ||||
| __tx_BadHandler: | ||||
|     B       __tx_BadHandler | ||||
|  | ||||
|     PUBLIC  __tx_IntHandler | ||||
| __tx_IntHandler: | ||||
| // VOID InterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     /* Do interrupt handler work here */ | ||||
|     /* .... */ | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
|     PUBLIC  __tx_SysTickHandler | ||||
|     PUBLIC SysTick_Handler | ||||
| SysTick_Handler: | ||||
| __tx_SysTickHandler: | ||||
| // VOID TimerInterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     BL      _tx_timer_interrupt | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
|     PUBLIC  __tx_NMIHandler | ||||
| __tx_NMIHandler: | ||||
|     B       __tx_NMIHandler | ||||
|  | ||||
|     PUBLIC  __tx_DBGHandler | ||||
| __tx_DBGHandler: | ||||
|     B       __tx_DBGHandler | ||||
|  | ||||
|     END | ||||
| #endif | ||||
|  | ||||
| #if (defined(__GNUC__) && !defined(__clang__)) | ||||
| /**************************************************************************/ | ||||
| /*                                                                        */ | ||||
| /*       Copyright (c) Microsoft Corporation. All rights reserved.        */ | ||||
| /*                                                                        */ | ||||
| /*       This software is licensed under the Microsoft Software License   */ | ||||
| /*       Terms for Microsoft Azure RTOS. Full text of the license can be  */ | ||||
| /*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */ | ||||
| /*       and in the root directory of this software.                      */ | ||||
| /*                                                                        */ | ||||
| /**************************************************************************/ | ||||
|  | ||||
| /**************************************************************************/ | ||||
| /**************************************************************************/ | ||||
| /**                                                                       */ | ||||
| /** ThreadX Component                                                     */ | ||||
| /**                                                                       */ | ||||
| /**   Initialize                                                          */ | ||||
| /**                                                                       */ | ||||
| /**************************************************************************/ | ||||
| /**************************************************************************/ | ||||
|  | ||||
| SYSTEM_CLOCK      =   250000000 | ||||
| SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1) | ||||
|  | ||||
| /**************************************************************************/ | ||||
| /*                                                                        */ | ||||
| /*  FUNCTION                                               RELEASE        */ | ||||
| /*                                                                        */ | ||||
| /*    _tx_initialize_low_level                          Cortex-M33/GNU    */ | ||||
| /*                                                           6.1          */ | ||||
| /*  AUTHOR                                                                */ | ||||
| /*                                                                        */ | ||||
| /*    Scott Larson, Microsoft Corporation                                 */ | ||||
| /*                                                                        */ | ||||
| /*  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.             */ | ||||
| /*                                                                        */ | ||||
| /*  INPUT                                                                 */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  OUTPUT                                                                */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  CALLS                                                                 */ | ||||
| /*                                                                        */ | ||||
| /*    None                                                                */ | ||||
| /*                                                                        */ | ||||
| /*  CALLED BY                                                             */ | ||||
| /*                                                                        */ | ||||
| /*    _tx_initialize_kernel_enter           ThreadX entry function        */ | ||||
| /*                                                                        */ | ||||
| /*  RELEASE HISTORY                                                       */ | ||||
| /*                                                                        */ | ||||
| /*    DATE              NAME                      DESCRIPTION             */ | ||||
| /*                                                                        */ | ||||
| /*  09-30-2020      Scott Larson            Initial Version 6.1           */ | ||||
| /*                                                                        */ | ||||
| /**************************************************************************/ | ||||
| // VOID   _tx_initialize_low_level(VOID) | ||||
| // { | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  _tx_initialize_low_level | ||||
|     .thumb_func | ||||
| .type _tx_initialize_low_level, function | ||||
| _tx_initialize_low_level: | ||||
|  | ||||
|     /* Disable interrupts during ThreadX initialization.  */ | ||||
|     CPSID   i | ||||
|  | ||||
|     /* Set base of available memory to end of non-initialised RAM area.  */ | ||||
| #ifdef USE_DYNAMIC_MEMORY_ALLOCATION | ||||
|     LDR     r0, =_tx_initialize_unused_memory       // Build address of unused memory pointer | ||||
|     LDR     r1, =__RAM_segment_used_end__           // Build first free address | ||||
|     ADD     r1, r1, #4                              // | ||||
|     STR     r1, [r0]                                // Setup first unused memory pointer | ||||
| #endif | ||||
|     /* Setup Vector Table Offset Register.  */ | ||||
|     MOV     r0, #0xE000E000                         // Build address of NVIC registers | ||||
|     LDR     r1, =g_pfnVectors                       // Pickup address of vector table | ||||
|     STR     r1, [r0, #0xD08]                        // Set vector table address | ||||
|  | ||||
|     /* Enable the cycle count register.  */ | ||||
|     LDR     r0, =0xE0001000                         // Build address of DWT register | ||||
|     LDR     r1, [r0]                                // Pickup the current value | ||||
|     ORR     r1, r1, #1                              // Set the CYCCNTENA bit | ||||
|     STR     r1, [r0]                                // Enable the cycle count register | ||||
|  | ||||
|     /* Set system stack pointer from vector value.  */ | ||||
|     LDR     r0, =_tx_thread_system_stack_ptr        // Build address of system stack pointer | ||||
|     LDR     r1, =g_pfnVectors                       // Pickup address of vector table | ||||
|     LDR     r1, [r1]                                // Pickup reset stack pointer | ||||
|     STR     r1, [r0]                                // Save system stack pointer | ||||
|  | ||||
|     /* Configure SysTick.  */ | ||||
|     MOV     r0, #0xE000E000                         // Build address of NVIC registers | ||||
|     LDR     r1, =SYSTICK_CYCLES | ||||
|     STR     r1, [r0, #0x14]                         // Setup SysTick Reload Value | ||||
|     MOV     r1, #0x7                                // Build SysTick Control Enable Value | ||||
|     STR     r1, [r0, #0x10]                         // Setup SysTick Control | ||||
|  | ||||
|     /* Configure handler priorities.  */ | ||||
|     LDR     r1, =0x00000000                         // Rsrv, UsgF, BusF, MemM | ||||
|     STR     r1, [r0, #0xD18]                        // Setup System Handlers 4-7 Priority Registers | ||||
|  | ||||
|     LDR     r1, =0xFF000000                         // SVCl, Rsrv, Rsrv, Rsrv | ||||
|     STR     r1, [r0, #0xD1C]                        // Setup System Handlers 8-11 Priority Registers | ||||
|                                                     // Note: SVC must be lowest priority, which is 0xFF | ||||
|  | ||||
|     LDR     r1, =0x40FF0000                         // SysT, PnSV, Rsrv, DbgM | ||||
|     STR     r1, [r0, #0xD20]                        // Setup System Handlers 12-15 Priority Registers | ||||
|                                                     // Note: PnSV must be lowest priority, which is 0xFF | ||||
|  | ||||
|     /* Return to caller.  */ | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
| /* Define shells for each of the unused vectors.  */ | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_BadHandler | ||||
|     .thumb_func | ||||
| .type __tx_BadHandler, function | ||||
| __tx_BadHandler: | ||||
|     B       __tx_BadHandler | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_IntHandler | ||||
|     .thumb_func | ||||
| .type __tx_IntHandler, function | ||||
| __tx_IntHandler: | ||||
| // VOID InterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     /* Do interrupt handler work here */ | ||||
|     /* .... */ | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  SysTick_Handler | ||||
|     .thumb_func | ||||
| .type SysTick_Handler, function | ||||
| SysTick_Handler: | ||||
| // VOID TimerInterruptHandler (VOID) | ||||
| // { | ||||
|     PUSH    {r0,lr}     // Save LR (and dummy r0 to maintain stack alignment) | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_enter             // Call the ISR enter function | ||||
| #endif | ||||
|     BL      _tx_timer_interrupt | ||||
| #if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)) | ||||
|     BL      _tx_execution_isr_exit              // Call the ISR exit function | ||||
| #endif | ||||
|     POP     {r0,lr} | ||||
|     BX      lr | ||||
| // } | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_NMIHandler | ||||
|     .thumb_func | ||||
| .type __tx_NMIHandler, function | ||||
| __tx_NMIHandler: | ||||
|     B       __tx_NMIHandler | ||||
|  | ||||
|     .section .text | ||||
|     .balign 4 | ||||
|     .syntax unified | ||||
|     .eabi_attribute Tag_ABI_align_preserved, 1 | ||||
|     .global  __tx_DBGHandler | ||||
|     .thumb_func | ||||
| .type __tx_DBGHandler, function | ||||
| __tx_DBGHandler: | ||||
|     B       __tx_DBGHandler | ||||
|  | ||||
|     .end | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user
	 chauyin
					chauyin