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
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355757
  • 源代码
    +关注

    关注

    96

    文章

    2945

    浏览量

    66731
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3557
收藏 人收藏

    评论

    相关推荐

    信号的时域波形和频谱的关系是什么

    信号的时域波形和频谱的关系是个复杂而深入的话题,涉及到信号处理、系统分析、通信原理等多个领域。 引言 在
    的头像 发表于 07-15 14:27 929次阅读

    信号的时域波形和频谱的关系

    信号的时域波形和频谱的关系是信号处理领域的核心内容之。本文将从信号的基本概念、时域和频域的定义、傅里叶变换、时域波形与频谱的关系、应用
    的头像 发表于 06-03 09:33 1576次阅读

    在做lwip+ucos+stm32的项目,ping不通是什么原因导致的?

    ethernetif_input发信号量,tcp_thread完成发送任务。现在的ethernetif代码修改了,参考了焦海波的指南和freertos的例子,但是ping不通;
    发表于 05-16 06:28

    STM32F303 ucos ii任务调度都用什么?

    现在303上用ucos ii跑了两个任务个是显示LCD,个是读取FRAM。现在发现,若读FRAM的优先级高,有时LCD会花屏闪,若显
    发表于 05-14 06:16

    emwin发布信号量ucos的其他任务失败的原因?

    { OSTaskSemPost( COM_TaskTCB, OS_OPT_POST_NONE, err); } break; 这个是emwin回调函数的部分代码,下载之后直接进入硬件中断,如果没有任务等待这个信号
    发表于 05-11 07:20

    OSSemPend有时不成功的原因?

    过程中,发现正常运行段时间后,任务再也无法Pend成功。 哪位大侠遇见过这种情况,求指点迷津!!! 信号量创建为: OSSemCreate( UsartOneDmaRecDoneSem, \"URT one dma rec
    发表于 05-11 07:09

    关于FreeRTOS互斥的用法求解

    对于串口发送,我们都普遍用中断方式发送, 可是在配合互斥的时候会遇到些问题, 互斥的使用 必须在同任务中 占用和释放, 我目前的做法是用二值
    发表于 04-24 08:03

    求助,关于FreeRTOS的相关疑问求解

    1.最近在学习FreeRTOS(stm32下),虽然好像知道了队列和信号量是用来做任务之间的通信的,但是不太理解为什么要用这些东西,我觉得好像用rtos的队列和
    发表于 04-24 07:08

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

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

    freertos串口接收数据后如何发送给任务

    最大长度? 如果用二值信号量,是不是就等于是中断程序接收完后发送信号量通知任务处理数组?这样的话,在任务处理过程中,串口又接收到新的数据怎么办? 其他还有什么办法呢?
    发表于 04-18 06:36

    嵌入式实时操作系统——二值信号量

    当用户需要使用停车资源时,它靠近屏障并按下请求按钮,在信号量术语中,该行为被定义为信号等待(wait)操作。由于资源处于空闲状态,故服务员抬起屏障并回答可以通过, 用户随即进入保护区域,然后屏障关闭。
    发表于 04-09 14:44 656次阅读
    嵌入式实时操作系统——二值<b class='flag-5'>信号量</b>

    STM32H747双核的HSEM运行FreeRtos系统会卡死是怎么回事?

    SemaphoreGiveFromISR就正常。 3。怀疑是FreeRtos问题,有做了实验,使用了按键中断,中断优先级和HSEM样,都是6,在中断可以里使用SemaphoreGiveFromISR或任务二值信号量,不会
    发表于 03-28 06:32

    基于嵌入式OS的LwIP协议栈

    设计通信协议栈程序,需要具备内存管理、任务管理、进程通信信号量、时钟、定时处理等功能,从头开始难度巨大,而且容易出错。
    发表于 02-03 16:19 838次阅读
    基于嵌入式OS的LwIP协议栈

    信号量实现原理介绍

    除了原子操作,中断屏蔽,自旋锁以及自旋锁的衍生锁之外,在Linux内核中还存在着些其他同步互斥的手段。
    的头像 发表于 01-10 09:07 1183次阅读

    stm32移植ucos iii教程

    µC/OS-III是个实时操作系统,广泛应用于嵌入式系统开发中。在STM32系列微控制器上移植µC/OS-III可以充分发挥其实时性和多任务处理能力。本篇文章将为您提供个详实、细致
    的头像 发表于 01-02 16:29 1500次阅读