如今随着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:工程group的添加;2:头文件搜索路径的添加 最终我的工程的配置如下图所示:
三、一些必要文件的修改
首先是apm32f10x_it.c的修改,这个文件是启动文件中定义的中断向量函数的具体实现,有两个中断函数与RTOS相关,需要我们修改,如下图所示:
图中的PendSV_Handler函数需要注释掉,os_cpu_a.s会利用这个中断函数进行上下文切换。
图中的SysTick_Handler函数是RTOS的系统滴答时钟,也是RTOS的调度粒度,RTOS在这个时钟节拍的节奏下进行任务的调度。
其次是加入RTOS系统滴答时钟的初始化函数,并在任务创建前完成时钟的初始化:
这里介绍一个很重要的宏OS_CFG_TICK_RATE_HZ,本工程中设置1000,就是每隔1ms,系统任务调度一次,所以我们的时钟要按照1ms的时间间隔进行初始化。
然后就是一些头文件包含关系的修改,此处不再说明。
四、任务的建立和功能的实现
本工程demo比较简单,主要是实现一个LED循环闪烁,一个LED通过按键控制的功能。
所以工程中一共需要三个task,一个task是主task,在该task中会对板级硬件进行初始化,包括引脚的配置,外设初始化等,最后创建其它功能性task;一个task实现LED循环闪烁的功能;一个task在等待按键的中断函数唤醒,唤醒后执行LED的控制动作。
上图是三个task的数据机构
上图是一些必要的初始化和主task的创建。
上图是在主task中初始化bsp以及创建功能性task。
上图是两个功能task,task1实现LED每隔1s,周期性的亮灭,task2在等待信号唤醒。
上图是唤醒task2的函数。
按键按下后,在按键的中断函数中给task2发送唤醒信号,唤醒task2。
五、编译下载
上述步骤完成后,编译工程,下载到开发板中即可实现功能,相关的工程代码如附件所示,解压编译后可直接使用。
热门活动
全部回复 0
暂无评论,快来抢沙发吧