RTOS实时操作系统uCOS-III向STM32F103移植过程(2)

OK,寒冷的冬天,让我们继续上节的uCOS-III移植尾巴。
上节移植最后编译我们已经将所有的错误都修正了,但是这不代表着就完事了,我们还要根据自己选择的板子来调试代码让uCOS-III能顺利的在我们的板子上运行,这里我选用的是原子哥的Stm32f103RCT6 V3.3版本的mini开发板来做移植实验。
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第1张图片
那么板子准备好以后,Let’s start !
首先我们打开工程的app.c文件看里面的main函数,发现main函数里面就做了开关中断、初始化系统、创建一个起始任务启动内核四大件事情。
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第2张图片
接着再去看它刚刚创建的那个起始任务,看看它都做了什么。
可以看到这里先是初始化了BSP、CPU和内存管理,再通过设置OS_CFG_STAT_TASK_EN宏等于1大于0,使能计算CPU的使用率功能,设置APP_CFG_SERIAL_EN 宏等于 DEF_ENABLED,初始化STM32的串口,并且设置串口的波特率为115200,但是点进BSP_Ser_Init(115200)里会发现它只初始化了串口2,而我们想用的是串口1来传输数据(当然你也可以用串口2来传输),最后处理while(1)里面的任务。
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第3张图片
之所以会选用串口功能的工程模板来做uCOS-III的移植,就是为了能方便的直接用串口1来进行程序的调试。所以我们现在要做的就是在main()函数和AppTaskStart()函数用模板工程里面本身的串口函数来进行串口初始化。在app.c添加一行#include “usart.h”头文件,然后在bsp.c文件下的BSP_Init()函数里添加uart_init(115200),就是在BSP_Init函数里初始化了串口1,转回app.c的main()函数里,将BSP_Init()直接添加在前面。在main函数里的每一个函数前面都加上这么一句“printf(“uCOS-III_TEST x\r\n”);”(x为数字1,2,3…每添加一个就加1),完了之后直接编译。
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第4张图片
编译结束后发现居然 0 Errors!是不是太惊喜!然后怀着半信半疑又带点小兴奋的将程序烧录进去,打开串口调试助手,点击复位按键,心里乱蹦着小鹿期待着打印信息的出现。但是,一秒过去了、两秒过去了。。。你会发现什么都没有(这时你应该会怀疑自己编译时少了漏了哪一步,再检查添加的都已添加了,然后再编译再下载,发现还是什么现象都没有)。那么究竟是哪里出了错呢?
让我们看下SysTick_HandlerPendSV_Handler两个函数,SysTick_Handler是滴答定时器中断,这个中断相当于操作系统的心脏,在它的中断服务函数中,提供进程/任务的上下文切换和任务调度的工作PendSV_Handler函数作用是当操作系统(OS)检测到某IRQ正在活动,并且被SysTick抢占,它将触发一个PendSV异常,以便缓期执行上下文切换。
打开“startup_stm32f10x_hd.s”启动文件,看到异常向量表里面定义的这两个函数。
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第5张图片
但是我们在“stm32f10x_it.c”文件里却看到这两个函数为空!将这两个函数都注释掉
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第6张图片
所以我们现在要做的就是找到uCOS-III源码中定义的这两个函数,打开os_cpu_c.c文件,看到源码自定义的SysTick_Handler函数被命名为OS_CPU_SysTickHandler,将其名字改为SysTick_Handler。如下图所示:
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第7张图片
打开“os_cpu_a.s”文件,看到源码自定义的PendSV_Handler函数被命名为OS_CPU_PendSVHandler,将其名字改为PendSV_Handler,然后在上面改一下声明,如下图所示:
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第8张图片
这里写图片描述
然后再全部编译一遍,“0 Errors”,烧录程序,看是否有期待的打印信息出现
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第9张图片
看到打印信息已全部出现,说明在main函数中运行没有问题,再将printf打印函数部署到AppTaskStart起始任务里,看上下文切换、任务调度等是否正常。如下图所示:
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第10张图片
编译,烧录!
RTOS实时操作系统uCOS-III向STM32F103移植过程(2)_第11张图片
发现串口打印十个信息已全部打印出来,说明程序没有任何问题。到此为止移植uCOS-III就大功告成!
接下来学习就可以先自己在AppTaskStart起始任务里的while(1)函数里调试LED闪烁程序,再尝试自己创建几个任务,实现它们之间互相的任务调度。待玩得差不多时,再去分析uCOS-III的源码,会更容易接受一些~
祝各位”RTOS-uCOS“旅途愉快~

你可能感兴趣的:(uCOS)