0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-24 13:59 次阅读

Ⅰ、写在前面

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348720
  • 源代码
    +关注

    关注

    94

    文章

    2926

    浏览量

    66061
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3527
收藏 人收藏

    评论

    相关推荐

    STM32F107+CubeMX+FreeRTOS+LWIP连接成功后,信号量无法使用怎么解决?

    各位大哥,遇到个在FreeRTOS+LWIP使用信号量的问题。 项目工程是通过CubeMX生成的,使用FreeRTOS + LWIP。 简化代码,FreeRTOS初始化两个任务
    发表于 04-19 07:33

    FreeRTOS信号量的使用与实例

    在嵌入式系统中,任务管理是一个重要的部分,它涉及到任务之间的通信和同步,信号量,队列,互斥锁和事件标志组等概念。本文将以 FreeRTOS 为例,详细讲解这些内容。
    的头像 发表于 12-12 15:25 624次阅读

    freertos中任务可以支持多个信号量吗?

    freertos中任务可以支持多个信号量
    发表于 11-07 06:58

    野火stm32+UCOS+LED1(单任务)

    电子发烧友网站提供《野火stm32+UCOS+LED1(单任务).rar》资料免费下载
    发表于 11-03 11:34 7次下载
    野火<b class='flag-5'>stm32+UCOS</b>+LED1(单<b class='flag-5'>任务</b>)

    野火stm32+UCOS+LED1+LED2+LED3(多任务

    电子发烧友网站提供《野火stm32+UCOS+LED1+LED2+LED3(多任务).rar》资料免费下载
    发表于 11-03 11:14 0次下载
    野火<b class='flag-5'>stm32+UCOS</b>+LED1+LED2+LED3(多<b class='flag-5'>任务</b>)

    关于RTOS中的信号量问题

    信号量是操作系统里的个基本概念 我现在了解信号量是做什么的,怎么做的。 限于工作经验,只能用到二值信号量。计数型信号量用在什么场合呢? 请
    发表于 10-31 06:25

    怎么使用ucos信号量

    应该怎么使用ucos信号量,在什么情况下使用二进制信号量和数值型信号量
    发表于 10-07 07:41

    STM32H7 HSEM硬件信号量

    管理访问权限和同步• 不同的进程运行在相同的CPU上• 不同的CPU• 共32信号量• 两种锁机制• 2-step write, read back lock• 1-step read lock• 信号量释放会生成中断
    发表于 09-11 06:50

    FreeRTOS队列创建任务通信的基本应用程序

    应用程序 : 此代码是 FreeRTOS 队列创建任务通信的基本应用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    发表于 08-22 07:12

    释放信号量唤醒线程后,程序死机Hard_fault如何解决?

    系统在运行过程中出现死机,经过cmbacktrace 回溯发现在释放信号量的地方出错, 程序设计为,A线程释放信号量后唤醒B线程,但在发送信号量切换线程以后出现了bug。 扩大被唤
    发表于 08-20 16:50

    Semaphore信号量概念及其介绍

    信号量即Semaphore。信号量主要用于控制和保护任务对特定资源的访问。
    的头像 发表于 07-25 15:40 866次阅读
    Semaphore<b class='flag-5'>信号量</b>概念及其介绍

    FreeRTOS四种信号量详细介绍

    1、二值信号量 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二
    的头像 发表于 07-06 17:14 1205次阅读

    请教个AT组件的信号量的问题

    我现在使用AT组件中的EC20模块,程序初始化以后at_client_getchar函数就在等待信号量client->rx_notice,如下面第个图所示,但是我搜了
    发表于 05-11 14:22

    AT组件中的at_skt0 等等的信号量是什么情况下产生的?怎么产生的?

    ,socket打开就不正常了,然后就会多出几个at_skt0,at_skt1等等的信号量,有的时候我的线程还会挂起在这些信号量上,我在工程里搜也没有搜到相关的定义和内容,请问这些信号量是什么情况下产生的?怎么产生的?我想看看为什
    发表于 05-11 09:57

    rt_thread spi设备+信号量+线程的处理方法不够快,有优化的吗?

    中断产生信号量 void IQR_DRDY(void *args) { rt_sem_release(rx_sem);//产生信号量(释放信号量) } 线程获取信号量 while(1
    发表于 04-27 11:29