Ⅰ、写在前面
本文主要讲述UCOS2基于STM32硬件平台下,两个任务之间利用信号量进行通信实现的方法,具体实现原理将在后面文章讲述。
本文主要站在应用的角度来分析信号量通信,与芯片相关的底层这里不过多描述。本文虽然是STM32F1的芯片,但也适合其他芯片的学习(应用层)。
今天提供的工程代码也适用于STM32其他系列芯片(下载我前面移植好的其他系列工程,替换bsp和app下面相关文件就行。 当然,里面LED、按键和串口驱动如果不是对应的引脚,请适当改一下)。
与本文相关的UCOS移植和内核的讲述可以进入我微信公众号“历史消息”查看。
关于本文的更多详情请往下看。
Ⅱ、本文要点
1.软件工程源代码下载
我将今天所讲述内容源代码经过测试无误之后上传至360云盘方便大家下载参考学习。
STM32其他系列也可以下载参考,请看“历史消息”。
本文源代码工程下载地址:
https://yunpan.cn/ck5RWT48WcpHj访问密码 9017
2.工程代码实现功能效果
为了方便大家理解上面提供下载的软件工程源代码,这里先来讲述一下软件工程实现的功能和效果。
提供下载源代码是由MDK-ARM V5软件下运行,如果你没有安装MDK-ARM软件可以参考我的另外一篇文章:
MDK-ARM下载、安装与注册
建立3个任务:
开始(主)任务AppTaskStart:主要开始初始化底层及相关代码;
应用任务APP_Task1:接收信号量消息;
应用任务APP_Task2:发送信号量消息。
信号量事件EventSem_Key:主要用于任务1和任务2之间通信。
任务1接收到信号消息一次串口打印一次计数值(用于记录按键按下次数);
任务2按键一次,发送信号量消息一次(按下状态时LED2会亮);
【实例类似于同学2给同学1发红包,同学2每次发一元红包,同学1每打开红包一次,显示(打印)余额增加一元】
Ⅲ、源代码分析
信号量作用和原理那些这里就不再过多用文字描述,我主要结合源代码工程来描述信号量通信的原理。
1.工程目录结构
打开下载的源代码工程可以看见整个工程结构如下图所示,为了方便理解,我命名的文件名应该算是比较贴合实际意义。
“bsp_task1”和“bsp_task2”:主要是俩任务的底层驱动代码。如:初始化IO、USART等。我专门将其单独设立在独自的文件下,主要是方便理解,同样也是为了规范代码工程(建议大家写代码命名和文件命名都要按照常规要求来,方便自己理解)。
“app_task1”和“app_task2”:同样的道理,这里主要是放置任务应用层的源代码。如:实现按键检测、串口打印数据、发送和接收信号量消息。
“global_variable”:主要是全局变量。由于信号量通信是介于两个任务之间的一个信号量,因此完全属于任务1,也不完全属于任务2,是任务1和任务2共同的变量。因此归类为全局变量中。
2.os_cfg系统配置
需要使用信号量相关的资源,就需要在“系统配置”中打开“信号量”功能:
#define OS_SEM_EN 1u
(本文主要就是使用了信号量“发送”和“接收”功能,关于信号量其他功能暂时没有使用到。)
3.两任务底层代码
任务底层代码和我们前面开发裸机程序一样,就是初始化及与芯片底层相关的代码。
【注意:LED、按键、USART等引脚不对应的就在这里修改】
下面是任务1和任务底层初始化代码(应该很熟悉)
4.“开始”任务
“开始”任务代码中包含的信息比较多,大概分为框图中几类,具体意思见后面注释。
【注意:“开始”任务也是一个任务,因此它的任务就是LED1闪烁,以便提示系统在正常运行(1秒变化一次)】
5.任务1应用代码
任务1应用代码是实现接收(任务2发送的)信号量。当接收到信号量消息就串口打印数据,每接收一次信号量,计数值就增加一次。
6.任务2应用代码
任务2应用代码是实现发送信号量(给任务1)。每按键一次,就发送信号一次。按下按键状态是LED2处于亮的状态(提示按键已经按下)。
Ⅳ、说明
本文是偏向应用的代码,关于信号量如何实现,比较底层的描述我会在后期讲述一下。
以上总结仅供参考,若有不对之处,敬请谅解。
更多关于UCOS的文章:
UCOS2_STM32移植详细过程(汇总)
UCOS2系统内核讲述(五)_初始化TCB详情