硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX新发布的MDK AC5版移植文件tx_initialize_low_level.s处理的欠妥

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-7-16 08:45:48 | 显示全部楼层 |阅读模式


这次升级直接让ThreadX去接管各厂家的.S启动文件,这个对于ThreadX自己来说省事了。

对于用户来说略麻烦了,不同系列的中断数基本都略有区别,换个系列就要重新倒腾一次这个启动文件。

最好的还是像之前那样,独立出来是最方便的。

  1. ;/**************************************************************************/
  2. ;/*                                                                        */
  3. ;/*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  4. ;/*                                                                        */
  5. ;/**************************************************************************/
  6. ;
  7. ;
  8. ;/**************************************************************************/
  9. ;/**************************************************************************/
  10. ;/**                                                                       */
  11. ;/** ThreadX Component                                                     */
  12. ;/**                                                                       */
  13. ;/**   Initialize                                                          */
  14. ;/**                                                                       */
  15. ;/**************************************************************************/
  16. ;/**************************************************************************/
  17. ;
  18. ;#define TX_SOURCE_CODE
  19. ;
  20. ;
  21. ;/* Include necessary system files.  */
  22. ;
  23. ;#include "tx_api.h"
  24. ;#include "tx_initialize.h"
  25. ;#include "tx_thread.h"
  26. ;#include "tx_timer.h"
  27. ;
  28. ;
  29.     IMPORT  _tx_thread_system_stack_ptr
  30.     IMPORT  _tx_initialize_unused_memory
  31.     IMPORT  _tx_timer_interrupt
  32.     IMPORT  __main
  33.     IMPORT  |Image$RO$Limit|
  34.     IMPORT  |Image$RW$Base|
  35.     IMPORT  |Image$ZI$Base|
  36.     IMPORT  |Image$ZI$Limit|
  37.     IMPORT  __tx_PendSVHandler
  38. ;
  39. ;
  40. SYSTEM_CLOCK        EQU     6000000
  41. SYSTICK_CYCLES      EQU     ((SYSTEM_CLOCK / 100) -1)
  42. ;
  43. ;
  44. ;/* Setup the stack and heap areas.  */
  45. ;
  46. STACK_SIZE          EQU     0x00000400
  47. HEAP_SIZE           EQU     0x00000000

  48.     AREA    STACK, NOINIT, READWRITE, ALIGN=3
  49. StackMem
  50.     SPACE   STACK_SIZE
  51. __initial_sp


  52.     AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  53. __heap_base
  54. HeapMem
  55.     SPACE   HEAP_SIZE
  56. __heap_limit


  57.     AREA    RESET, CODE, READONLY
  58. ;
  59.     EXPORT  __tx_vectors
  60. __tx_vectors
  61.     DCD     __initial_sp                            ; Reset and system stack ptr
  62.     DCD     Reset_Handler                           ; Reset goes to startup function
  63.     DCD     __tx_NMIHandler                         ; NMI
  64.     DCD     __tx_BadHandler                         ; HardFault
  65.     DCD     0                                       ; MemManage
  66.     DCD     0                                       ; BusFault
  67.     DCD     0                                       ; UsageFault
  68.     DCD     0                                       ; 7
  69.     DCD     0                                       ; 8
  70.     DCD     0                                       ; 9
  71.     DCD     0                                       ; 10
  72.     DCD     __tx_SVCallHandler                      ; SVCall
  73.     DCD     __tx_DBGHandler                         ; Monitor
  74.     DCD     0                                       ; 13
  75.     DCD     __tx_PendSVHandler                      ; PendSV
  76.     DCD     __tx_SysTickHandler                     ; SysTick
  77.     DCD     __tx_IntHandler                         ; Int 0
  78.     DCD     __tx_IntHandler                         ; Int 1
  79.     DCD     __tx_IntHandler                         ; Int 2
  80.     DCD     __tx_IntHandler                         ; Int 3
  81.         
  82. ;
  83. ;
  84.     AREA ||.text||, CODE, READONLY
  85.     EXPORT  Reset_Handler
  86. Reset_Handler
  87.     CPSID   i
  88.     LDR     R0, =__main
  89.     BX      R0


  90. ;/**************************************************************************/
  91. ;/*                                                                        */
  92. ;/*  FUNCTION                                               RELEASE        */
  93. ;/*                                                                        */
  94. ;/*    _tx_initialize_low_level                          Cortex-M3/AC5     */
  95. ;/*                                                           6.0.1        */
  96. ;/*  AUTHOR                                                                */
  97. ;/*                                                                        */
  98. ;/*    William E. Lamie, Microsoft Corporation                             */
  99. ;/*                                                                        */
  100. ;/*  DESCRIPTION                                                           */
  101. ;/*                                                                        */
  102. ;/*    This function is responsible for any low-level processor            */
  103. ;/*    initialization, including setting up interrupt vectors, setting     */
  104. ;/*    up a periodic timer interrupt source, saving the system stack       */
  105. ;/*    pointer for use in ISR processing later, and finding the first      */
  106. ;/*    available RAM memory address for tx_application_define.             */
  107. ;/*                                                                        */
  108. ;/*  INPUT                                                                 */
  109. ;/*                                                                        */
  110. ;/*    None                                                                */
  111. ;/*                                                                        */
  112. ;/*  OUTPUT                                                                */
  113. ;/*                                                                        */
  114. ;/*    None                                                                */
  115. ;/*                                                                        */
  116. ;/*  CALLS                                                                 */
  117. ;/*                                                                        */
  118. ;/*    None                                                                */
  119. ;/*                                                                        */
  120. ;/*  CALLED BY                                                             */
  121. ;/*                                                                        */
  122. ;/*    _tx_initialize_kernel_enter           ThreadX entry function        */
  123. ;/*                                                                        */
  124. ;/*  RELEASE HISTORY                                                       */
  125. ;/*                                                                        */
  126. ;/*    DATE              NAME                      DESCRIPTION             */
  127. ;/*                                                                        */
  128. ;/*  06-30-2020     William E. Lamie         Initial Version 6.0.1         */
  129. ;/*                                                                        */
  130. ;/**************************************************************************/
  131. ;VOID   _tx_initialize_low_level(VOID)
  132. ;{
  133.     EXPORT  _tx_initialize_low_level
  134. _tx_initialize_low_level
  135. ;
  136. ;    /* Disable interrupts during ThreadX initialization.  */
  137. ;
  138.     CPSID   i
  139. ;
  140. ;    /* Set base of available memory to end of non-initialised RAM area.  */
  141. ;     
  142.     LDR     r0, =_tx_initialize_unused_memory   ; Build address of unused memory pointer
  143.     LDR     r1, =|Image$ZI$Limit|             ; Build first free address
  144.     ADD     r1, r1, #4                          ;
  145.     STR     r1, [r0]                            ; Setup first unused memory pointer
  146. ;
  147. ;    /* Setup Vector Table Offset Register.  */
  148. ;   
  149.     MOV     r0, #0xE000E000                     ; Build address of NVIC registers
  150.     LDR     r1, =__tx_vectors                   ; Pickup address of vector table
  151.     STR     r1, [r0, #0xD08]                    ; Set vector table address   
  152. ;
  153. ;    /* Enable the cycle count register.  */
  154. ;
  155. ;    LDR     r0, =0xE0001000                     ; Build address of DWT register
  156. ;    LDR     r1, [r0]                            ; Pickup the current value
  157. ;    ORR     r1, r1, #1                          ; Set the CYCCNTENA bit
  158. ;    STR     r1, [r0]                            ; Enable the cycle count register
  159. ;
  160. ;    /* Set system stack pointer from vector value.  */
  161. ;
  162.     LDR     r0, =_tx_thread_system_stack_ptr    ; Build address of system stack pointer
  163.     LDR     r1, =__tx_vectors                   ; Pickup address of vector table
  164.     LDR     r1, [r1]                            ; Pickup reset stack pointer
  165.     STR     r1, [r0]                            ; Save system stack pointer
  166. ;
  167. ;    /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference.  */
  168. ;
  169.     MOV     r0, #0xE000E000                     ; Build address of NVIC registers
  170.     LDR     r1, =SYSTICK_CYCLES
  171.     STR     r1, [r0, #0x14]                     ; Setup SysTick Reload Value
  172.     MOV     r1, #0x7                            ; Build SysTick Control Enable Value
  173.     STR     r1, [r0, #0x10]                     ; Setup SysTick Control
  174. ;
  175. ;    /* Configure handler priorities.  */
  176. ;
  177.     LDR     r1, =0x00000000                     ; Rsrv, UsgF, BusF, MemM
  178.     STR     r1, [r0, #0xD18]                    ; Setup System Handlers 4-7 Priority Registers

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

  182.     LDR     r1, =0x40FF0000                     ; SysT, PnSV, Rsrv, DbgM
  183.     STR     r1, [r0, #0xD20]                    ; Setup System Handlers 12-15 Priority Registers
  184.                                                 ; Note: PnSV must be lowest priority, which is 0xFF
  185. ;
  186. ;    /* Return to caller.  */
  187. ;   
  188.     BX      lr
  189. ;}
  190. ;
  191. ;      
  192. ;/* Define initial heap/stack routine for the ARM RVCT startup code.
  193. ;   This routine will set the initial stack and heap locations */
  194. ;
  195.     EXPORT  __user_initial_stackheap
  196. __user_initial_stackheap
  197.     LDR     R0, =HeapMem
  198.     LDR     R1, =(StackMem + STACK_SIZE)
  199.     LDR     R2, =(HeapMem + HEAP_SIZE)
  200.     LDR     R3, =StackMem
  201.     BX      LR
  202. ;
  203. ;
  204. ;/* Define shells for each of the unused vectors.  */
  205. ;
  206.     EXPORT  __tx_BadHandler
  207. __tx_BadHandler
  208.     B   __tx_BadHandler


  209.     EXPORT  __tx_SVCallHandler
  210. __tx_SVCallHandler
  211.     B       __tx_SVCallHandler


  212.     EXPORT  __tx_IntHandler
  213. __tx_IntHandler
  214. ; VOID InterruptHandler (VOID)
  215. ; {
  216.     PUSH    {r0, lr}
  217.         
  218. ;    /* Do interrupt handler work here */
  219. ;    /* .... */

  220.     POP     {r0, lr}
  221.     BX      LR
  222. ; }

  223.     EXPORT  __tx_SysTickHandler
  224. __tx_SysTickHandler
  225. ; VOID TimerInterruptHandler (VOID)
  226. ; {
  227. ;
  228.     PUSH    {r0, lr}
  229.     BL      _tx_timer_interrupt
  230.     POP     {r0, lr}
  231.     BX      LR
  232. ; }

  233.     EXPORT  __tx_NMIHandler
  234. __tx_NMIHandler
  235.     B       __tx_NMIHandler

  236.     EXPORT  __tx_DBGHandler
  237. __tx_DBGHandler
  238.     B       __tx_DBGHandler

  239.     ALIGN
  240.     LTORG
  241.     END
复制代码


回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 08:52:08 | 显示全部楼层
所以说这个文件需要改动。因为启动文件冲突了,所以我把他给修改了。独立出来使用。。。。
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 08:56:47 | 显示全部楼层
我修改后的 _tx_initialize_low_level.s 文件如下,,我这个是基于Cortex-M7的,其他的芯片可以参照这个方式来改,,芯片本身的 .S文件不需要修改。。。


tx_initialize_low_level.s (8.2 KB, 下载次数: 61)


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2020-7-16 08:59:23 | 显示全部楼层
yjwpm 发表于 2020-7-16 08:56
我修改后的 _tx_initialize_low_level.s 文件如下,,我这个是基于Cortex-M7的,其他的芯片可以参照这个方 ...

谢谢分享,还是这种老版的形式比较方便。
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 09:00:55 | 显示全部楼层
eric2013 发表于 2020-7-16 08:59
谢谢分享,还是这种老版的形式比较方便。

是的,不过官方那个是基于芯片内核形式来写的,没有具体的对应芯片。。。。。还是比较好修改的。。。
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 09:04:21 | 显示全部楼层
本帖最后由 yjwpm 于 2020-7-16 09:19 编辑

我把这两个函数给屏蔽了,,  _tx_execution_thread_enter    _tx_execution_thread_exit 之后等有时间了,重新添加一下,这两个函数在 V6.0.0和V6.0.1里面的结构体有改动。。所以我暂时屏蔽了。。。。。
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 09:29:54 | 显示全部楼层
本帖最后由 yjwpm 于 2020-7-16 09:33 编辑

看错了,不是改动,是需要修改一下tx_port.h文件,定义TX_THREAD_EXTENSION_3  要修改
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 09:47:42 | 显示全部楼层
AC5、AC6  _tx_execution_thread_enter    _tx_execution_thread_exit 这个两个函数添加完成。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2020-7-16 09:55:17 | 显示全部楼层
yjwpm 发表于 2020-7-16 09:47
AC5、AC6  _tx_execution_thread_enter    _tx_execution_thread_exit 这个两个函数添加完成。。。

这两个主要是用于统计任务CPU利用率之类的场合,我测试过,不太好用,改用uCOS的方案了。

ThreadX的CPU利用率实现方式一:原装的任务切入切出API接口函数实现
https://forum.anfulai.cn/forum.p ... 8122&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2020-7-16 12:05:39 | 显示全部楼层
eric2013 发表于 2020-7-16 09:55
这两个主要是用于统计任务CPU利用率之类的场合,我测试过,不太好用,改用uCOS的方案了。

ThreadX的CP ...

是的,不过我不统计CPU使用率,单纯的想把他移植好。估计这就是强迫症的表现吧。。。。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2020-7-16 13:25:21 | 显示全部楼层
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2020-11-19 09:27:07 | 显示全部楼层
那如果换个芯片 , .s文件都要自己重新写吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2020-11-19 14:04:21 | 显示全部楼层
jcx0324 发表于 2020-11-19 09:27
那如果换个芯片 , .s文件都要自己重新写吗?

这个新版的,他们大部分芯片都已经专门制作.s

更简单的,此贴

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

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2020-11-26 16:54:51 | 显示全部楼层
eric2013 发表于 2020-11-19 14:04
这个新版的,他们大部分芯片都已经专门制作.s

更简单的,此贴

专门的.S文件貌似信息也不全的, 是不是还是无法取代启动文件
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2020-11-26 17:25:47 | 显示全部楼层
或者说直接在.s文件中增加中断数量就行了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2020-11-27 01:46:48 | 显示全部楼层
jcx0324 发表于 2020-11-26 17:25
或者说直接在.s文件中增加中断数量就行了?

看我做的这个整。

ThreadX内核教程更新记录帖,前7章已发布(2020-09-14)
https://forum.anfulai.cn/forum.p ... 9514&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2020-11-27 01:47:19 | 显示全部楼层
jcx0324 发表于 2020-11-26 16:54
专门的.S文件貌似信息也不全的, 是不是还是无法取代启动文件

或者此贴更简单的办法:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 17:55 , Processed in 0.051599 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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