UCOS2_STM32_任务间信号量通信(一)_ 应用实例描述

发布时间:2023-08-01  

Ⅰ、写在前面

本文主要讲述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详情


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    (主)任务AppTaskStart:主要开始初始化底层及相关代码; 应用任务APP_Task1:接收信号量消息; 应用任务APP_Task2:发送信号量消息。 信号量事件EventSem_Key:主要......
    的方法关联,就是在2440设置外部中断,在中断程序中读DM9000的中断状态寄存器ISR,判断是接收还是发送中断,然后利用邮箱或者信号量的功能,引导执行相应的程序。另一种就是利用UCOS的任......
    高优先级可以把放出去给低优先级任务使用的CPU占用权抢回来。所以ucos的任务间要注意插入等待延时,以便ucos切出去让低优先级任务执行。 十二、UCOSII中任务间的通信方式有哪几种? 解答: 在UCOSII中,是使用信号量......
    互斥条件);标志事件的发生。 对信号量一般可以实施以下3种操作:初始化(INITIALIZE)信号量或者称为创建信号量(CREATE);等待信号量(WAIT)或者称为挂起信号量(PEND);发送信号量(POST......
    );   vTaskStartScheduler(); } 接着我们按照会出现优先级反转的情况编写测试代码。 首先挂起高优先级和中优先级任务。 低优先级任务持续打印运行信息,当运行到5次时,恢复高优先级任务持续打印信息,高优先级任务打印三次后等待低优先级任务发送信号量......
    和数据采集这两个任务。因为只有等运行采集任务,在片外RAM中保存了数据之后,数据发送任务才能发送。所以在任务的调度上为了协调好两者的关系,于是在这两个任务之中加入了一个任务之间通信的信号量。开始时信号量为0表示......
    的整数倍时,对方将通信帧全部发送完毕后,最后一批数据必定不足14字节,从而导致超时中断,就可以在超时中断中发送信号量来通知接收任务,成功地结束接收过程。 当通信帧的长度正好为14的整数倍时,对方将通信帧全部发送......
    系统调用指令完成   2、保护当前任务现场   3、恢复新任务现场   4、执行中断返回指令 内存管理:   在ANSI C中使用 malloc()和free() 函数动态的分配内存和释放内存   ucos中,操作......
    动接收队列监视任务,定期扫描环形缓冲区。一旦发现读指针与写指针不相等时,就将环形缓冲区中新接收到的数据存入TEMPBUF中,同时发送信号量SendSem。数据转发任务接收到信号量,启动运行,完成......
    大体思路 第一个LED灯翻转,发送信号量。定义一个轮询函数用来时刻检测信号量状况,当信号量到达一定数量时恢复LED2任务的运行,当信号量满时清空信号量列表并挂起LED2 任务......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>