本帖最后由 nhtzhanshi 于 2020-7-21 23:59 编辑

       如今随着mcu存储空间越来越大,功能越来越复杂,单纯的裸机程序已经不能满足我们的开发需求,所以RTOS的重要性就日益凸显。APM32F103VB开发板搭载的芯片是APM32F103VBT6,主频96MHz,Flash:128K,SRAM:20KB,可以说片上资源比较丰富,足够满足一个RTOS的运行条件,本文就在APM32F103VB开发板上运行我们常用的uCOS-III RTOS,并实现一个LED周期性闪烁,另一个LED受按键控制的简单demo程序。
        由于以前进行过stm32上uCOS-III的移植工作,所此次就不从头开始移植,而是在stm32的已经移植过的base上针对APM32F103VB进行修改。

一、工程建立
        第一步是建立一个新的工程,思想还是利用example中现成的工程进行移植,所以我将EINT文件夹下的MDK_Project文件夹复制到新工程的文件夹中,这样工程文件就有了,然后将标准库函数也复制到这个文件夹中,这样驱动就有了,最后将uCOS-III相关的文件夹也复制过来,最后形成了如下的文件夹结构。
1.PNG
2.PNG
3.PNG
4.PNG
5.PNG
6.PNG
7.PNG
8.PNG
9.PNG

二、工程的配置
        文件夹的结构建立好之后就双击打开工程,准备对工程进行配置,工程的配置主要体现在两个方面:1:工程group的添加;2:头文件搜索路径的添加              最终我的工程的配置如下图所示:
10.PNG
11.PNG
12.PNG
13.PNG
14.PNG
15.PNG
16.PNG
17.PNG

三、一些必要文件的修改
        首先是apm32f10x_it.c的修改,这个文件是启动文件中定义的中断向量函数的具体实现,有两个中断函数与RTOS相关,需要我们修改,如下图所示:
18.PNG

        图中的PendSV_Handler函数需要注释掉,os_cpu_a.s会利用这个中断函数进行上下文切换。
        图中的SysTick_Handler函数是RTOS的系统滴答时钟,也是RTOS的调度粒度,RTOS在这个时钟节拍的节奏下进行任务的调度。

        其次是加入RTOS系统滴答时钟的初始化函数,并在任务创建前完成时钟的初始化:

19.PNG
20.PNG

        这里介绍一个很重要的宏OS_CFG_TICK_RATE_HZ,本工程中设置1000,就是每隔1ms,系统任务调度一次,所以我们的时钟要按照1ms的时间间隔进行初始化。
        然后就是一些头文件包含关系的修改,此处不再说明。

四、任务的建立和功能的实现
        本工程demo比较简单,主要是实现一个LED循环闪烁,一个LED通过按键控制的功能。
        所以工程中一共需要三个task,一个task是主task,在该task中会对板级硬件进行初始化,包括引脚的配置,外设初始化等,最后创建其它功能性task;一个task实现LED循环闪烁的功能;一个task在等待按键的中断函数唤醒,唤醒后执行LED的控制动作。

21.PNG
        上图是三个task的数据机构

22.PNG
        上图是一些必要的初始化和主task的创建。

23.PNG
        上图是在主task中初始化bsp以及创建功能性task。

24.PNG
        上图是两个功能task,task1实现LED每隔1s,周期性的亮灭,task2在等待信号唤醒。

25.PNG
        上图是唤醒task2的函数。

26.PNG
        按键按下后,在按键的中断函数中给task2发送唤醒信号,唤醒task2。

五、编译下载
        上述步骤完成后,编译工程,下载到开发板中即可实现功能,相关的工程代码如附件所示,解压编译后可直接使用。

uCOS-III.zip (6.03 MB, 下载次数: 14)
全部回复 0
暂无评论,快来抢沙发吧