AC5 和 AC6 代码不太一样
移植Threadx 的道理就在tx_initialize_low_level.s中
tx_initialize_low_level 的作用是做操作系统底层初始化操作,在Threadx初始化过程中执行。
可以参考 FREERTOS 中的代码 void vTaskStartScheduler( void )
两个版本可以根据需求选择的用。
不是说Threadx 要接管STM32的启动文件不务正业,原因是Threadx有一套耦合紧密的结构需要从底层做起。
用户去修改启动文件对启动文件有入侵性,还有就是增加了开发难度,所以Threadx做好了一部分作为一个示例。
tx_initialize_low_level 放在的文件夹为ac5\example_build ,ac6\example_build\sample_threadx
example,sample的本意意义是个例子
AC6
/**/ C语言的注解符号可能会报错
SYSTEM_CLOCK CPU CLOCK的设定
SYSTICK_CYCLES RTOS systick频率
SYSTEM_CLOCK = 400000000
SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1)
@VOID _tx_initialize_low_level(VOID)
@{
.global _tx_initialize_low_level
.thumb_func
_tx_initialize_low_level:
@
@ /* Disable interrupts during ThreadX initialization. */
@
关闭中断
CPSID i
@
@ /* Set base of available memory to end of non-initialised RAM area. */
@
LDR r0, =_tx_initialize_unused_memory @ Build address of unused memory pointer
LDR r1, =Image$$ARM_LIB_STACKHEAP$$ZI$$Limit@ Build first free address
ADD r1, r1, #4 @
STR r1, [r0] @ Setup first unused memory pointer
@
1.把_tx_initialize_unused_memory 地址放入r0寄存器
2.把STACKHEAP 堆地址的上限放入r1寄存器
3.r1寄存器值+4,也就是移动到未被使用的内存地址,第一个空内存
4.把r1的值填入r0指向的空间。
一套操作下来 _tx_initialize_unused_memory = RAM_segment_used_end + 4
@ /* 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, #