硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6340|回复: 15
收起左侧

[ThreadX全家桶] STM32CubeMX生成的MDK版ThreadX工程中MDK,IAR和GCC三合一文件tx_initialize_low_level.S不适合MDK使用

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-3-6 08:52:53 | 显示全部楼层 |阅读模式



他这个汇编文件里面做了个条件编译来说自动识别IAR,GCC和MDK,这种做法用于IAR和GCC是可以的,而用于MDK不行。

简单解决办法,删除IAR和GCC的条件编译,并将宏定义永久使能USE_DYNAMIC_MEMORY_ALLOCATION



  1. ;/**************************************************************************/
  2. ;/*                                                                        */
  3. ;/*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  4. ;/*                                                                        */
  5. ;/*       This software is licensed under the Microsoft Software License   */
  6. ;/*       Terms for Microsoft Azure RTOS. Full text of the license can be  */
  7. ;/*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */
  8. ;/*       and in the root directory of this software.                      */
  9. ;/*                                                                        */
  10. ;/**************************************************************************/
  11. ;
  12. ;
  13. ;/**************************************************************************/
  14. ;/**************************************************************************/
  15. ;/**                                                                       */
  16. ;/** ThreadX Component                                                     */
  17. ;/**                                                                       */
  18. ;/**   Initialize                                                          */
  19. ;/**                                                                       */
  20. ;/**************************************************************************/
  21. ;/**************************************************************************/
  22.     IMPORT  _tx_thread_system_stack_ptr
  23.     IMPORT  _tx_initialize_unused_memory
  24.     IMPORT  _tx_thread_context_save
  25.     IMPORT  _tx_thread_context_restore
  26.     IMPORT  _tx_timer_interrupt
  27.     IMPORT  |Image$RW_IRAM1$ZI$Limit|
  28.     IMPORT  __tx_PendSVHandler
  29.     IMPORT  __Vectors

  30. SYSTEM_CLOCK      EQU   64000000
  31. SYSTICK_CYCLES    EQU   ((SYSTEM_CLOCK / 100) -1)

  32.     AREA ||.text||, CODE, READONLY

  33. ;/**************************************************************************/
  34. ;/*                                                                        */
  35. ;/*  FUNCTION                                               RELEASE        */
  36. ;/*                                                                        */
  37. ;/*    _tx_initialize_low_level                          Cortex-M7/AC5     */
  38. ;/*                                                           6.1          */
  39. ;/*  AUTHOR                                                                */
  40. ;/*                                                                        */
  41. ;/*    William E. Lamie, Microsoft Corporation                             */
  42. ;/*                                                                        */
  43. ;/*  DESCRIPTION                                                           */
  44. ;/*                                                                        */
  45. ;/*    This function is responsible for any low-level processor            */
  46. ;/*    initialization, including setting up interrupt vectors, setting     */
  47. ;/*    up a periodic timer interrupt source, saving the system stack       */
  48. ;/*    pointer for use in ISR processing later, and finding the first      */
  49. ;/*    available RAM memory address for tx_application_define.             */
  50. ;/*                                                                        */
  51. ;/*  INPUT                                                                 */
  52. ;/*                                                                        */
  53. ;/*    None                                                                */
  54. ;/*                                                                        */
  55. ;/*  OUTPUT                                                                */
  56. ;/*                                                                        */
  57. ;/*    None                                                                */
  58. ;/*                                                                        */
  59. ;/*  CALLS                                                                 */
  60. ;/*                                                                        */
  61. ;/*    None                                                                */
  62. ;/*                                                                        */
  63. ;/*  CALLED BY                                                             */
  64. ;/*                                                                        */
  65. ;/*    _tx_initialize_kernel_enter           ThreadX entry function        */
  66. ;/*                                                                        */
  67. ;/*  RELEASE HISTORY                                                       */
  68. ;/*                                                                        */
  69. ;/*    DATE              NAME                      DESCRIPTION             */
  70. ;/*                                                                        */
  71. ;/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
  72. ;/*                                                                        */
  73. ;/**************************************************************************/
  74. ;VOID   _tx_initialize_low_level(VOID)
  75. ;{
  76.     EXPORT  _tx_initialize_low_level
  77. _tx_initialize_low_level
  78. ;
  79. ;    /* Disable interrupts during ThreadX initialization.  */
  80. ;
  81.     CPSID   i
  82. ;
  83. ;    /* Set base of available memory to end of non-initialised RAM area.  */
  84. ;
  85. #ifdef USE_DYNAMIC_MEMORY_ALLOCATION
  86.     LDR     r0, =_tx_initialize_unused_memory       ; Build address of unused memory pointer
  87.     LDR     r1, =|Image$RW_IRAM1$ZI$Limit|                 ; Build first free address
  88.     ADD     r1, r1, #4                              ;
  89.     STR     r1, [r0]                                ; Setup first unused memory pointer
  90. #endif
  91. ;
  92. ;    /* Setup Vector Table Offset Register.  */
  93. ;
  94.     MOV     r0, #0xE000E000                         ; Build address of NVIC registers
  95.     LDR     r1, =__Vectors                       ; Pickup address of vector table
  96.     STR     r1, [r0, #0xD08]                        ; Set vector table address
  97. ;
  98. ;    /* Enable the cycle count register.  */
  99. ;
  100. ;    LDR     r0, =0xE0001000                         ; Build address of DWT register
  101. ;    LDR     r1, [r0]                                ; Pickup the current value
  102. ;    ORR     r1, r1, #1                              ; Set the CYCCNTENA bit
  103. ;    STR     r1, [r0]                                ; Enable the cycle count register
  104. ;
  105. ;    /* Set system stack pointer from vector value.  */
  106. ;
  107.     LDR     r0, =_tx_thread_system_stack_ptr        ; Build address of system stack pointer
  108.     LDR     r1, =__Vectors                       ; Pickup address of vector table
  109.     LDR     r1, [r1]                                ; Pickup reset stack pointer
  110.     STR     r1, [r0]                                ; Save system stack pointer
  111. ;
  112. ;    /* Configure SysTick.  */
  113. ;
  114.     MOV     r0, #0xE000E000                         ; Build address of NVIC registers
  115.     LDR     r1, =SYSTICK_CYCLES
  116.     STR     r1, [r0, #0x14]                         ; Setup SysTick Reload Value
  117.     MOV     r1, #0x7                                ; Build SysTick Control Enable Value
  118.     STR     r1, [r0, #0x10]                         ; Setup SysTick Control
  119. ;
  120. ;    /* Configure handler priorities.  */
  121. ;
  122.     LDR     r1, =0x00000000                         ; Rsrv, UsgF, BusF, MemM
  123.     STR     r1, [r0, #0xD18]                        ; Setup System Handlers 4-7 Priority Registers

  124.     LDR     r1, =0xFF000000                         ; SVCl, Rsrv, Rsrv, Rsrv
  125.     STR     r1, [r0, #0xD1C]                        ; Setup System Handlers 8-11 Priority Registers
  126.                                                     ; Note: SVC must be lowest priority, which is 0xFF

  127.     LDR     r1, =0x40FF0000                         ; SysT, PnSV, Rsrv, DbgM
  128.     STR     r1, [r0, #0xD20]                        ; Setup System Handlers 12-15 Priority Registers
  129.                                                     ; Note: PnSV must be lowest priority, which is 0xFF
  130. ;
  131. ;    /* Return to caller.  */
  132. ;
  133.     BX      lr
  134. ;}
  135. ;
  136. ;

  137. ;
  138. ;/* Define shells for each of the unused vectors.  */
  139. ;
  140.     EXPORT  __tx_BadHandler
  141. __tx_BadHandler
  142.     B       __tx_BadHandler

  143.     EXPORT  __tx_SVCallHandler
  144. __tx_SVCallHandler
  145.     B       __tx_SVCallHandler

  146.     EXPORT  __tx_IntHandler
  147. __tx_IntHandler
  148. ; VOID InterruptHandler (VOID)
  149. ; {
  150.     PUSH    {r0, lr}

  151. ;    /* Do interrupt handler work here */
  152. ;    /* .... */

  153.     POP     {r0, lr}
  154.     BX      LR
  155. ; }
  156.     EXPORT  SysTick_Handler
  157.     EXPORT  __tx_SysTickHandler

  158. __tx_SysTickHandler
  159. SysTick_Handler
  160. ; VOID TimerInterruptHandler (VOID)
  161. ; {
  162. ;
  163.     PUSH    {r0, lr}
  164.     BL      _tx_timer_interrupt
  165.     POP     {r0, lr}
  166.     BX      LR
  167. ; }

  168.     EXPORT  __tx_NMIHandler
  169. __tx_NMIHandler
  170.     B       __tx_NMIHandler

  171.     EXPORT  __tx_DBGHandler
  172. __tx_DBGHandler
  173.     B       __tx_DBGHandler

  174.     ALIGN
  175.     LTORG
  176.     END

复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-6 08:53:57 | 显示全部楼层
其实更加推荐用此贴的方法,将省去修改汇编文件的繁琐。

说干就干,修改ThreadX内核移植的tx_initialize_low_level.s汇编文件为C文件
http://armbbs.cn/forum.php?mod=v ... 0053&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2021-3-6 15:39:18 | 显示全部楼层
看来还是自己手动靠谱
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-7 08:04:19 | 显示全部楼层
yklstudent 发表于 2021-3-6 15:39
看来还是自己手动靠谱

估计他们后面得升级下这个port文件。当前的实现欠妥。
回复

使用道具 举报

29

主题

97

回帖

184

积分

初级会员

积分
184
发表于 2021-3-10 13:53:11 | 显示全部楼层
cubemx现在可以生成 ThreadX 工程了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-10 14:58:53 | 显示全部楼层
wgp2590 发表于 2021-3-10 13:53
cubemx现在可以生成 ThreadX 工程了?

是的,可以生成了。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2021-3-12 10:35:50 | 显示全部楼层
生成了ThreadX的工程,tx_initialize_low_level.s已更改,但报这个错误,是不是没有包含头文件导致的?
2021-03-12_102415.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-12 10:55:59 | 显示全部楼层
lhaoyue 发表于 2021-3-12 10:35
生成了ThreadX的工程,tx_initialize_low_level.s已更改,但报这个错误,是不是没有包含头文件导致的?

楼主位这个是给AC5用的。
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2021-3-12 11:26:37 | 显示全部楼层
eric2013 发表于 2021-3-12 10:55
楼主位这个是给AC5用的。

AC6 要用那个呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-13 10:32:54 | 显示全部楼层
lhaoyue 发表于 2021-3-12 11:26
AC6 要用那个呢?

直接使用我这个里面的即可:

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

15

主题

117

回帖

162

积分

初级会员

积分
162
发表于 2021-3-13 14:59:33 | 显示全部楼层
eric2013 发表于 2021-3-13 10:32
直接使用我这个里面的即可:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=103554&extra=page% ...

谢谢硬汉,辛苦了~
回复

使用道具 举报

41

主题

112

回帖

235

积分

高级会员

积分
235
发表于 2021-3-17 13:31:02 | 显示全部楼层
eric2013 发表于 2021-3-10 14:58
是的,可以生成了。

threadx 是顶级rtos,也是中断0等待吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-3-17 15:35:51 | 显示全部楼层
bear_yh 发表于 2021-3-17 13:31
threadx 是顶级rtos,也是中断0等待吗?

不是,不过可以使用PRIBASE做不受ThreadX管理的中断做0中断延迟。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2021-3-20 22:04:19 | 显示全部楼层
MDK里面也可以干这种c语言式的条件编译的,你需要在Option for Target->Asm的Misc Controls填上--cpreproc
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-10-23 12:18:49 | 显示全部楼层
硬汉大哥,最新的STM32CubeMX,生成的H7用的ThreadX工程()  tx_initialize_low_level.S 是这样的:



  1. // by default AzureRTOS is configured to use static byte pool for
  2. // allocation, in case dynamic allocation is to be used, uncomment
  3. // the define below and update the linker files to define the following symbols
  4. // EWARM toolchain:
  5. //       place in RAM_region    { last section FREE_MEM};
  6. // MDK-ARM toolchain;
  7. //       either define the RW_IRAM1 region in the ".sct" file or modify this file by referring to the correct memory region.
  8. //         LDR r1, =|Image$RW_IRAM1$ZI$Limit|
  9. // STM32CubeIDE toolchain:
  10. //       ._threadx_heap :
  11. //       {
  12. //        . = ALIGN(8);
  13. //        __RAM_segment_used_end__ = .;
  14. //        . = . + 64K;
  15. //        . = ALIGN(8);
  16. //       } >RAM_D1 AT> RAM_D1
  17. //  The simplest way to provide memory for ThreadX is to define a new section, see ._threadx_heap above.
  18. //  In the example above the ThreadX heap size is set to 64KBytes.
  19. //  The ._threadx_heap must be located between the .bss and the ._user_heap_stack sections in the linker script.
  20. //  Caution: Make sure that ThreadX does not need more than the provided heap memory (64KBytes in this example).
  21. //  Read more in STM32CubeIDE User Guide, chapter: "Linker script".

  22. //#define USE_DYNAMIC_MEMORY_ALLOCATION

  23. #ifdef __CC_ARM
  24. @/**************************************************************************/
  25. @/*                                                                        */
  26. @/*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  27. @/*                                                                        */
  28. @/*       This software is licensed under the Microsoft Software License   */
  29. @/*       Terms for Microsoft Azure RTOS. Full text of the license can be  */
  30. @/*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */
  31. @/*       and in the root directory of this software.                      */
  32. @/*                                                                        */
  33. @/**************************************************************************/
  34. @
  35. @
  36. @/**************************************************************************/
  37. @/**************************************************************************/
  38. @/**                                                                       */
  39. @/** ThreadX Component                                                     */
  40. @/**                                                                       */
  41. @/**   Initialize                                                          */
  42. @/**                                                                       */
  43. @/**************************************************************************/
  44. @/**************************************************************************/
  45. @
  46. @
  47.     .global     _tx_thread_system_stack_ptr
  48.     .global     _tx_initialize_unused_memory
  49.     .global     _tx_timer_interrupt
  50.     .global     __main
  51.     .global     __tx_SVCallHandler
  52.     .global     __tx_PendSVHandler
  53.     .global     __tx_NMIHandler                     @ NMI
  54.     .global     __tx_BadHandler                     @ HardFault
  55.     .global     __tx_SVCallHandler                  @ SVCall
  56.     .global     __tx_DBGHandler                     @ Monitor
  57.     .global     __tx_PendSVHandler                  @ PendSV
  58.     .global     __tx_SysTickHandler                 @ SysTick
  59.     .global     __tx_IntHandler                     @ Int 0
  60.     .global     Image$RW_IRAM1$ZI$Limit
  61.     .global     __Vectors
  62. @
  63. @
  64. SYSTEM_CLOCK      =   520000000
  65. SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1)

  66.     .text 32
  67.     .align 4
  68.     .syntax unified
  69. @/**************************************************************************/
  70. @/*                                                                        */
  71. @/*  FUNCTION                                               RELEASE        */
  72. @/*                                                                        */
  73. @/*    _tx_initialize_low_level                          Cortex-M7/AC6     */
  74. @/*                                                           6.1          */
  75. @/*  AUTHOR                                                                */
  76. @/*                                                                        */
  77. @/*    William E. Lamie, Microsoft Corporation                             */
  78. @/*                                                                        */
  79. @/*  DESCRIPTION                                                           */
  80. @/*                                                                        */
  81. @/*    This function is responsible for any low-level processor            */
  82. @/*    initialization, including setting up interrupt vectors, setting     */
  83. @/*    up a periodic timer interrupt source, saving the system stack       */
  84. @/*    pointer for use in ISR processing later, and finding the first      */
  85. @/*    available RAM memory address for tx_application_define.             */
  86. @/*                                                                        */
  87. @/*  INPUT                                                                 */
  88. @/*                                                                        */
  89. @/*    None                                                                */
  90. @/*                                                                        */
  91. @/*  OUTPUT                                                                */
  92. @/*                                                                        */
  93. @/*    None                                                                */
  94. @/*                                                                        */
  95. @/*  CALLS                                                                 */
  96. @/*                                                                        */
  97. @/*    None                                                                */
  98. @/*                                                                        */
  99. @/*  CALLED BY                                                             */
  100. @/*                                                                        */
  101. @/*    _tx_initialize_kernel_enter           ThreadX entry function        */
  102. @/*                                                                        */
  103. @/*  RELEASE HISTORY                                                       */
  104. @/*                                                                        */
  105. @/*    DATE              NAME                      DESCRIPTION             */
  106. @/*                                                                        */
  107. @/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
  108. @/*                                                                        */
  109. @/**************************************************************************/
  110. @VOID   _tx_initialize_low_level(VOID)
  111. @{
  112.     .global  _tx_initialize_low_level
  113.     .thumb_func
  114. _tx_initialize_low_level:
  115. @
  116. @    /* Disable interrupts during ThreadX initialization.  */
  117. @
  118.     CPSID   i
  119. @
  120. @    /* Set base of available memory to end of non-initialised RAM area.  */
  121. @
  122. #ifdef USE_DYNAMIC_MEMORY_ALLOCATION
  123.     LDR     r0, =_tx_initialize_unused_memory       @ Build address of unused memory pointer
  124.     LDR     r1, = Image$RW_IRAM1$ZI$Limit        @ Build first free address
  125.     ADD     r1, r1, #4                              @
  126.     STR     r1, [r0]                                @ Setup first unused memory pointer
  127. #endif
  128. @
  129. @    /* Setup Vector Table Offset Register.  */
  130. @
  131.     MOV     r0, #0xE000E000                         @ Build address of NVIC registers
  132.     LDR     r1, =__Vectors                          @ Pickup address of vector table
  133.     STR     r1, [r0, #0xD08]                        @ Set vector table address
  134. @
  135. @    /* Set system stack pointer from vector value.  */
  136. @
  137.     LDR     r0, =_tx_thread_system_stack_ptr        @ Build address of system stack pointer
  138.     LDR     r1, =__Vectors                          @ Pickup address of vector table
  139.     LDR     r1, [r1]                                @ Pickup reset stack pointer
  140.     STR     r1, [r0]                                @ Save system stack pointer
  141. @
  142. @    /* Enable the cycle count register.  */
  143. @
  144.     LDR     r0, =0xE0001000                         @ Build address of DWT register
  145.     LDR     r1, [r0]                                @ Pickup the current value
  146.     ORR     r1, r1, #1                              @ Set the CYCCNTENA bit
  147.     STR     r1, [r0]                                @ Enable the cycle count register
  148. @
  149. @    /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference.  */
  150. @
  151.     MOV     r0, #0xE000E000                         @ Build address of NVIC registers
  152.     LDR     r1, =SYSTICK_CYCLES
  153.     STR     r1, [r0, #0x14]                         @ Setup SysTick Reload Value
  154.     MOV     r1, #0x7                                @ Build SysTick Control Enable Value
  155.     STR     r1, [r0, #0x10]                         @ Setup SysTick Control
  156. @
  157. @    /* Configure handler priorities.  */
  158. @
  159.     LDR     r1, =0x00000000                         @ Rsrv, UsgF, BusF, MemM
  160.     STR     r1, [r0, #0xD18]                        @ Setup System Handlers 4-7 Priority Registers

  161.     LDR     r1, =0xFF000000                         @ SVCl, Rsrv, Rsrv, Rsrv
  162.     STR     r1, [r0, #0xD1C]                        @ Setup System Handlers 8-11 Priority Registers
  163.                                                     @ Note: SVC must be lowest priority, which is 0xFF

  164.     LDR     r1, =0x40FF0000                         @ SysT, PnSV, Rsrv, DbgM
  165.     STR     r1, [r0, #0xD20]                        @ Setup System Handlers 12-15 Priority Registers
  166.                                                     @ Note: PnSV must be lowest priority, which is 0xFF
  167. @
  168. @    /* Return to caller.  */
  169. @
  170.     BX      lr
  171. @}
  172. @

  173. @/* Define shells for each of the unused vectors.  */
  174. @
  175.     .global  __tx_BadHandler
  176.     .thumb_func
  177. __tx_BadHandler:
  178.     B       __tx_BadHandler

  179. @ /* added to catch the hardfault */

  180.     .global  __tx_HardfaultHandler
  181.     .thumb_func
  182. __tx_HardfaultHandler:
  183.     B       __tx_HardfaultHandler

  184. @ /* added to catch the SVC */

  185.     .global  __tx_SVCallHandler
  186.     .thumb_func
  187. __tx_SVCallHandler:
  188.     B       __tx_SVCallHandler

  189. @ /* Generic interrupt handler template */
  190.     .global  __tx_IntHandler
  191.     .thumb_func
  192. __tx_IntHandler:
  193. @ VOID InterruptHandler (VOID)
  194. @ {
  195.     PUSH    {r0, lr}
  196. @    /* Do interrupt handler work here */
  197. @    /* BL <your C Function>.... */
  198.     POP     {r0, lr}
  199.     BX      LR
  200. @ }

  201. @ /* System Tick timer interrupt handler */
  202.     .global  __tx_SysTickHandler
  203.     .global  SysTick_Handler
  204.     .thumb_func
  205. __tx_SysTickHandler:
  206.     .thumb_func
  207. SysTick_Handler:
  208. @ VOID TimerInterruptHandler (VOID)
  209. @ {
  210. @
  211.     PUSH    {r0, lr}
  212.     BL      _tx_timer_interrupt
  213.     POP     {r0, lr}
  214.     BX      LR
  215. @ }

  216. @ /* NMI, DBG handlers */
  217.     .global  __tx_NMIHandler
  218.     .thumb_func
  219. __tx_NMIHandler:
  220.     B       __tx_NMIHandler

  221.     .global  __tx_DBGHandler
  222.     .thumb_func
  223. __tx_DBGHandler:
  224.     B       __tx_DBGHandler
  225. .end
  226. #endif

  227. #ifdef __IAR_SYSTEMS_ASM__
  228. ;/**************************************************************************/
  229. ;/*                                                                        */
  230. ;/*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  231. ;/*                                                                        */
  232. ;/*       This software is licensed under the Microsoft Software License   */
  233. ;/*       Terms for Microsoft Azure RTOS. Full text of the license can be  */
  234. ;/*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */
  235. ;/*       and in the root directory of this software.                      */
  236. ;/*                                                                        */
  237. ;/**************************************************************************/
  238. ;
  239. ;
  240. ;/**************************************************************************/
  241. ;/**************************************************************************/
  242. ;/**                                                                       */
  243. ;/** ThreadX Component                                                     */
  244. ;/**                                                                       */
  245. ;/**   Initialize                                                          */
  246. ;/**                                                                       */
  247. ;/**************************************************************************/
  248. ;/**************************************************************************/
  249. ;
  250.     EXTERN  _tx_thread_system_stack_ptr
  251.     EXTERN  _tx_initialize_unused_memory
  252.     EXTERN  _tx_timer_interrupt
  253.     EXTERN  __vector_table
  254.     EXTERN  _tx_execution_isr_enter
  255.     EXTERN  _tx_execution_isr_exit
  256. ;
  257. ;
  258. SYSTEM_CLOCK      EQU   520000000
  259. SYSTICK_CYCLES    EQU   ((SYSTEM_CLOCK / 100) -1)
  260. #ifdef USE_DYNAMIC_MEMORY_ALLOCATION
  261.     RSEG    FREE_MEM:DATA
  262.     PUBLIC  __tx_free_memory_start
  263. __tx_free_memory_start
  264.     DS32    4
  265. #endif
  266. ;
  267. ;
  268.     SECTION `.text`:CODE:NOROOT(2)
  269.     THUMB
  270. ;/**************************************************************************/
  271. ;/*                                                                        */
  272. ;/*  FUNCTION                                               RELEASE        */
  273. ;/*                                                                        */
  274. ;/*    _tx_initialize_low_level                          Cortex-M7/IAR     */
  275. ;/*                                                           6.1          */
  276. ;/*  AUTHOR                                                                */
  277. ;/*                                                                        */
  278. ;/*    William E. Lamie, Microsoft Corporation                             */
  279. ;/*                                                                        */
  280. ;/*  DESCRIPTION                                                           */
  281. ;/*                                                                        */
  282. ;/*    This function is responsible for any low-level processor            */
  283. ;/*    initialization, including setting up interrupt vectors, setting     */
  284. ;/*    up a periodic timer interrupt source, saving the system stack       */
  285. ;/*    pointer for use in ISR processing later, and finding the first      */
  286. ;/*    available RAM memory address for tx_application_define.             */
  287. ;/*                                                                        */
  288. ;/*  INPUT                                                                 */
  289. ;/*                                                                        */
  290. ;/*    None                                                                */
  291. ;/*                                                                        */
  292. ;/*  OUTPUT                                                                */
  293. ;/*                                                                        */
  294. ;/*    None                                                                */
  295. ;/*                                                                        */
  296. ;/*  CALLS                                                                 */
  297. ;/*                                                                        */
  298. ;/*    None                                                                */
  299. ;/*                                                                        */
  300. ;/*  CALLED BY                                                             */
  301. ;/*                                                                        */
  302. ;/*    _tx_initialize_kernel_enter           ThreadX entry function        */
  303. ;/*                                                                        */
  304. ;/*  RELEASE HISTORY                                                       */
  305. ;/*                                                                        */
  306. ;/*    DATE              NAME                      DESCRIPTION             */
  307. ;/*                                                                        */
  308. ;/*  09-30-2020     William E. Lamie         Initial Version 6.1           */
  309. ;/*                                                                        */
  310. ;/**************************************************************************/
  311. ;VOID   _tx_initialize_low_level(VOID)
  312. ;{
  313.     PUBLIC  _tx_initialize_low_level
  314. _tx_initialize_low_level:
  315. ;
  316. ;    /* Ensure that interrupts are disabled.  */
  317. ;
  318.     CPSID   i                                       ; Disable interrupts
  319. ;
  320. ;
  321. ;    /* Set base of available memory to end of non-initialised RAM area.  */
  322. ;
  323. #ifdef USE_DYNAMIC_MEMORY_ALLOCATION

  324.     LDR     r0, =__tx_free_memory_start             ; Get end of non-initialized RAM area
  325.     LDR     r2, =_tx_initialize_unused_memory       ; Build address of unused memory pointer
  326.     STR     r0, [r2, #0]                            ; Save first free memory address
  327. #endif
  328. ;
  329. ;    /* Enable the cycle count register.  */
  330. ;
  331.     LDR     r0, =0xE0001000                         ; Build address of DWT register
  332.     LDR     r1, [r0]                                ; Pickup the current value
  333.     ORR     r1, r1, #1                              ; Set the CYCCNTENA bit
  334.     STR     r1, [r0]                                ; Enable the cycle count register
  335. ;
  336. ;    /* Setup Vector Table Offset Register.  */
  337. ;
  338.     MOV     r0, #0xE000E000                         ; Build address of NVIC registers
  339.     LDR     r1, =__vector_table                     ; Pickup address of vector table
  340.     STR     r1, [r0, #0xD08]                        ; Set vector table address
  341. ;
  342. ;    /* Set system stack pointer from vector value.  */
  343. ;
  344.     LDR     r0, =_tx_thread_system_stack_ptr        ; Build address of system stack pointer
  345.     LDR     r1, =__vector_table                     ; Pickup address of vector table
  346.     LDR     r1, [r1]                                ; Pickup reset stack pointer
  347.     STR     r1, [r0]                                ; Save system stack pointer
  348. ;
  349. ;    /* Configure SysTick.  */
  350. ;
  351.     MOV     r0, #0xE000E000                         ; Build address of NVIC registers
  352.     LDR     r1, =SYSTICK_CYCLES
  353.     STR     r1, [r0, #0x14]                         ; Setup SysTick Reload Value
  354.     MOV     r1, #0x7                                ; Build SysTick Control Enable Value
  355.     STR     r1, [r0, #0x10]                         ; Setup SysTick Control
  356. ;
  357. ;    /* Configure handler priorities.  */
  358. ;
  359.     LDR     r1, =0x00000000                         ; Rsrv, UsgF, BusF, MemM
  360.     STR     r1, [r0, #0xD18]                        ; Setup System Handlers 4-7 Priority Registers

  361.     LDR     r1, =0xFF000000                         ; SVCl, Rsrv, Rsrv, Rsrv
  362.     STR     r1, [r0, #0xD1C]                        ; Setup System Handlers 8-11 Priority Registers
  363.                                                     ; Note: SVC must be lowest priority, which is 0xFF

  364.     LDR     r1, =0x40FF0000                         ; SysT, PnSV, Rsrv, DbgM
  365.     STR     r1, [r0, #0xD20]                        ; Setup System Handlers 12-15 Priority Registers
  366.                                                     ; Note: PnSV must be lowest priority, which is 0xFF
  367. ;
  368. ;    /* Return to caller.  */
  369. ;
  370.     BX      lr
  371. ;}
  372. ;
  373. ;
  374.     PUBLIC  SysTick_Handler
  375.     PUBLIC  __tx_SysTickHandler
  376. __tx_SysTickHandler:
  377. SysTick_Handler:
  378. ;
  379. ; VOID SysTick_Handler (VOID)
  380. ; {
  381. ;
  382.     PUSH    {r0, lr}
  383. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  384.     BL      _tx_execution_isr_enter             ; Call the ISR enter function
  385. #endif
  386.     BL      _tx_timer_interrupt
  387. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  388.     BL      _tx_execution_isr_exit              ; Call the ISR exit function
  389. #endif
  390.     POP     {r0, lr}
  391.     BX      LR
  392. ; }
  393.     END
  394. #endif

  395. #ifdef __GNUC__
  396. @/**************************************************************************/
  397. @/*                                                                        */
  398. @/*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  399. @/*                                                                        */
  400. @/*       This software is licensed under the Microsoft Software License   */
  401. @/*       Terms for Microsoft Azure RTOS. Full text of the license can be  */
  402. @/*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */
  403. @/*       and in the root directory of this software.                      */
  404. @/*                                                                        */
  405. @/**************************************************************************/
  406. @
  407. @
  408. @/**************************************************************************/
  409. @/**************************************************************************/
  410. @/**                                                                       */
  411. @/** ThreadX Component                                                     */
  412. @/**                                                                       */
  413. @/**   Initialize                                                          */
  414. @/**                                                                       */
  415. @/**************************************************************************/
  416. @/**************************************************************************/
  417. @
  418. @
  419.     .global     _tx_thread_system_stack_ptr
  420.     .global     _tx_initialize_unused_memory
  421.     .global     __RAM_segment_used_end__
  422.     .global     _tx_timer_interrupt
  423.     .global     __main
  424.     .global     __tx_SVCallHandler
  425.     .global     __tx_PendSVHandler
  426.     .global     _vectors
  427.     .global     __tx_NMIHandler                     @ NMI
  428.     .global     __tx_BadHandler                     @ HardFault
  429.     .global     __tx_SVCallHandler                  @ SVCall
  430.     .global     __tx_DBGHandler                     @ Monitor
  431.     .global     __tx_PendSVHandler                  @ PendSV
  432.     .global     __tx_SysTickHandler                 @ SysTick
  433.     .global     __tx_IntHandler                     @ Int 0
  434. @
  435. @

  436. SYSTEM_CLOCK      =   520000000
  437. SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1)

  438.     .text 32
  439.     .align 4
  440.     .syntax unified
  441. @/**************************************************************************/
  442. @/*                                                                        */
  443. @/*  FUNCTION                                               RELEASE        */
  444. @/*                                                                        */
  445. @/*    _tx_initialize_low_level                          Cortex-M7/GNU     */
  446. @/*                                                           6.1          */
  447. @/*  AUTHOR                                                                */
  448. @/*                                                                        */
  449. @/*    William E. Lamie, Microsoft Corporation                             */
  450. @/*                                                                        */
  451. @/*  DESCRIPTION                                                           */
  452. @/*                                                                        */
  453. @/*    This function is responsible for any low-level processor            */
  454. @/*    initialization, including setting up interrupt vectors, setting     */
  455. @/*    up a periodic timer interrupt source, saving the system stack       */
  456. @/*    pointer for use in ISR processing later, and finding the first      */
  457. @/*    available RAM memory address for tx_application_define.             */
  458. @/*                                                                        */
  459. @/*  INPUT                                                                 */
  460. @/*                                                                        */
  461. @/*    None                                                                */
  462. @/*                                                                        */
  463. @/*  OUTPUT                                                                */
  464. @/*                                                                        */
  465. @/*    None                                                                */
  466. @/*                                                                        */
  467. @/*  CALLS                                                                 */
  468. @/*                                                                        */
  469. @/*    None                                                                */
  470. @/*                                                                        */
  471. @/*  CALLED BY                                                             */
  472. @/*                                                                        */
  473. @/*    _tx_initialize_kernel_enter           ThreadX entry function        */
  474. @/*                                                                        */
  475. @/*  RELEASE HISTORY                                                       */
  476. @/*                                                                        */
  477. @/*    DATE              NAME                      DESCRIPTION             */
  478. @/*                                                                        */
  479. @/*  05-19-2020     William E. Lamie         Initial Version 6.0           */
  480. @/*  09-30-2020     William E. Lamie         Modified Comment(s), fixed    */
  481. @/*                                            GNU assembly comment, clean */
  482. @/*                                            up whitespace, resulting    */
  483. @/*                                            in version 6.1              */
  484. @/*                                                                        */
  485. @/**************************************************************************/
  486. @VOID   _tx_initialize_low_level(VOID)
  487. @{
  488.     .global  _tx_initialize_low_level
  489.     .thumb_func
  490. _tx_initialize_low_level:
  491. @
  492. @    /* Disable interrupts during ThreadX initialization.  */
  493. @
  494.     CPSID   i
  495. @
  496. @    /* Set base of available memory to end of non-initialised RAM area.  */
  497. @
  498. #ifdef USE_DYNAMIC_MEMORY_ALLOCATION
  499.     LDR     r0, =_tx_initialize_unused_memory       @ Build address of unused memory pointer
  500.     LDR     r1, =__RAM_segment_used_end__           @ Build first free address
  501.     ADD     r1, r1, #4                              @
  502.     STR     r1, [r0]                                @ Setup first unused memory pointer
  503. #endif
  504. @
  505. @    /* Setup Vector Table Offset Register.  */
  506. @
  507.     MOV     r0, #0xE000E000                         @ Build address of NVIC registers
  508.     LDR     r1, =g_pfnVectors                           @ Pickup address of vector table
  509.     STR     r1, [r0, #0xD08]                        @ Set vector table address
  510. @
  511. @    /* Set system stack pointer from vector value.  */
  512. @
  513.     LDR     r0, =_tx_thread_system_stack_ptr        @ Build address of system stack pointer
  514.     LDR     r1, =g_pfnVectors                           @ Pickup address of vector table
  515.     LDR     r1, [r1]                                @ Pickup reset stack pointer
  516.     STR     r1, [r0]                                @ Save system stack pointer
  517. @
  518. @    /* Enable the cycle count register.  */
  519. @
  520.     LDR     r0, =0xE0001000                         @ Build address of DWT register
  521.     LDR     r1, [r0]                                @ Pickup the current value
  522.     ORR     r1, r1, #1                              @ Set the CYCCNTENA bit
  523.     STR     r1, [r0]                                @ Enable the cycle count register
  524. @
  525. @    /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference.  */
  526. @
  527.     MOV     r0, #0xE000E000                         @ Build address of NVIC registers
  528.     LDR     r1, =SYSTICK_CYCLES
  529.     STR     r1, [r0, #0x14]                         @ Setup SysTick Reload Value
  530.     MOV     r1, #0x7                                @ Build SysTick Control Enable Value
  531.     STR     r1, [r0, #0x10]                         @ Setup SysTick Control
  532. @
  533. @    /* Configure handler priorities.  */
  534. @
  535.     LDR     r1, =0x00000000                         @ Rsrv, UsgF, BusF, MemM
  536.     STR     r1, [r0, #0xD18]                        @ Setup System Handlers 4-7 Priority Registers

  537.     LDR     r1, =0xFF000000                         @ SVCl, Rsrv, Rsrv, Rsrv
  538.     STR     r1, [r0, #0xD1C]                        @ Setup System Handlers 8-11 Priority Registers
  539.                                                     @ Note: SVC must be lowest priority, which is 0xFF

  540.     LDR     r1, =0x40FF0000                         @ SysT, PnSV, Rsrv, DbgM
  541.     STR     r1, [r0, #0xD20]                        @ Setup System Handlers 12-15 Priority Registers
  542.                                                     @ Note: PnSV must be lowest priority, which is 0xFF
  543. @
  544. @    /* Return to caller.  */
  545. @
  546.     BX      lr
  547. @}
  548. @

  549. @/* Define shells for each of the unused vectors.  */
  550. @
  551.     .global  __tx_BadHandler
  552.     .thumb_func
  553. __tx_BadHandler:
  554.     B       __tx_BadHandler

  555. @ /* added to catch the hardfault */

  556.     .global  __tx_HardfaultHandler
  557.     .thumb_func
  558. __tx_HardfaultHandler:
  559.     B       __tx_HardfaultHandler

  560. @ /* added to catch the SVC */

  561.     .global  __tx_SVCallHandler
  562.     .thumb_func
  563. __tx_SVCallHandler:
  564.     B       __tx_SVCallHandler

  565. @ /* Generic interrupt handler template */
  566.     .global  __tx_IntHandler
  567.     .thumb_func
  568. __tx_IntHandler:
  569. @ VOID InterruptHandler (VOID)
  570. @ {
  571.     PUSH    {r0, lr}
  572. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  573.     BL      _tx_execution_isr_enter             @ Call the ISR enter function
  574. #endif

  575. @    /* Do interrupt handler work here */
  576. @    /* BL <your C Function>.... */

  577. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  578.     BL      _tx_execution_isr_exit              @ Call the ISR exit function
  579. #endif
  580.     POP     {r0, lr}
  581.     BX      LR
  582. @ }

  583. @ /* System Tick timer interrupt handler */
  584.     .global  __tx_SysTickHandler
  585.     .global  SysTick_Handler
  586.     .thumb_func
  587. __tx_SysTickHandler:
  588.     .thumb_func
  589. SysTick_Handler:
  590. @ VOID TimerInterruptHandler (VOID)
  591. @ {
  592. @
  593.     PUSH    {r0, lr}
  594. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  595.     BL      _tx_execution_isr_enter             @ Call the ISR enter function
  596. #endif
  597.     BL      _tx_timer_interrupt
  598. #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  599.     BL      _tx_execution_isr_exit              @ Call the ISR exit function
  600. #endif
  601.     POP     {r0, lr}
  602.     BX      LR
  603. @ }

  604. @ /* NMI, DBG handlers */
  605.     .global  __tx_NMIHandler
  606.     .thumb_func
  607. __tx_NMIHandler:
  608.     B       __tx_NMIHandler

  609.     .global  __tx_DBGHandler
  610.     .thumb_func
  611. __tx_DBGHandler:
  612.     B       __tx_DBGHandler

  613. #endif
复制代码


回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2022-4-30 07:38:13 | 显示全部楼层
cubemx生成的tx_initialize_low_level.S。把后面的删掉能不能直接使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 03:16 , Processed in 0.285719 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表