1. 修改ST的内核文件
参考https://blog.csdn.net/chuancey_cc/article/details/78474001 第四节
2. 替换启动文件
参考https://blog.csdn.net/chuancey_cc/article/details/78474001 第五节
3. 添加链接脚本
参考https://blog.csdn.net/chuancey_cc/article/details/78474001 第六节
4. 添加GCC汇编文件
uCOS-III源文件中的汇编代码,全部选择GNU目录下的文件,主要包括:
uC-CPU/ARM-Cortex-M3/GNU/cpu_a.s
uC-LIB/Ports/ARM-Cortex-M3/GNU/lib_mem_a.s
uCOS-III/Ports/ARM-Cortex-M3/Generic/GNU/os_cpu_a.s
将其添加到ucos-iii.mk中。
5. 汇编文件的修改
需要的修改的汇编文件为uCOS-III/Ports/ARM-Cortex-M3/Generic/GNU/os_cpu_a.s
。
cortex-m3内核通过PendSV触发任务调度,而所有的系统异常和中断的向量入口地址已经在启动文件中做了定义,PendSV的入口地址名称为PendSV_Handler
,即该异常的处理函数名称必须为PendSV_Handler
,而uCOS-III的os_cpu_a.s
中将PendSV的汇编处理函数名称定义为OS_CPU_PendSVHandler
,在产生PendSV异常后,系统找不到启动文件为其定义的PendSV_Handler
入口函数,OSStart()执行后,系统会死在OSStartHang
中,无法实现任务调度。必须将其名称更改为PendSV_Handler
,最好也将对应头文件中的函数声明也做同样的修改。
其实,PendSV_Handler
在stm32f10x_it.c
中已经定义了,需要将stm32f10x_it.c
中的实现屏蔽掉,防止编译报错。
为什么不保留os_cpu_a.s
中的OS_CPU_PendSVHandler
,去更改stm32f10x_it.c
中的PendSV_Handler
的实现呢?因为任务调度必须要速度很快,最好用汇编实现。
不止是PendSV,SysTick的异常入口地址在启动文件中定义为SysTick_Handler
,而uCOS-III的os_cpu_c.c
中将SysTick的处理函数名称定义为OS_CPU_SysTickHandler
,在产生SysTick异常后,系统找不到启动文件为其定义的SysTick_Handler
入口函数。
这个更改有两种方式:
(1) 保留os_cpu_c.c
中的OS_CPU_SysTickHandler
函数,将其函数实现拷贝到stm32f10x_it.c
中的SysTick_Handler
函数里。
(2) 将os_cpu_c.c
中的OS_CPU_SysTickHandler
函数更名为SysTick_Handler
,将stm32f10x_it.c
中的SysTick_Handler
函数屏蔽掉。
我习惯采用第一种方式。
针对第5点,还有一种是实现方式,就是把启动文件的两个异常入口地址更改为:OS_CPU_PendSVHandler
和OS_CPU_SysTickHandler
。