- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(STM32CubeMXFreeRTOS学习2二值信号量Lu
FreeRTOS学习之二:二值信号量前提:默认已经装好MDK V5和STM32CubeMX,并安装了STM32F1xx系列的支持包。硬件平台:STM32F1xx系列。目的:学习使用二值信号量进行任务同步。二值信号量主要用于任务的同步。本文例子使用STM32CubeMX配置创建两个任务,一个任务每秒钟发送一次信号量,另一个等待信号量并控制LED的输出状态。Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103RBTx。Step2.配置时钟引脚。Step3.配置PA8和PD2为Output,并把用户标签分别改为LED0,LED1。Step4.将系统时基源改为TIM4。Step5.使能FreeRTOS。Step6.配置时钟树。8M输入时,通过PLL得到72M内部时钟。Step7.配置FreeRTOS。在Tasks and Queues选项卡中,默认配置了一个名为defaultTask的任务,其优先级为普通,任务堆栈大小为128字,任务函数名为StartDefaultTask。双击蓝色的地方,弹出对话框,将任务名修改为Periodic,将任务函数名修改为PeriodicTask。点击Add按钮,增加一个任务Handle,优先级设置为Normal,函数名为HandleTask。在Timers and Semaphores选项卡,点击Binary Semaphores项右边的“Add”按钮,添加一个信号量,名称改为bSem01。注:该步骤中,除了添加任务和信号量,其他的都使用默认参数。Step8.生成代码。等完成后直接打开工程。工程基本组织结构如下图,其中Application/User组中的文件是用户可以修改的,而其他组中的文件一般不进行修改。Step9.分析程序结构。在进入main函数之前,先定义了几个变量,声明了几个函数。再看main函数。将main函数整理,删除很多注释之后,得到下图所示内容。其中第①部分,是硬件配置;第②部分,创建一个信号量和两个任务;第③部分,启动调度器。启动调度器后,程序就由FreeRTOS的调度器管理了,后面的while(1)是不会执行到的。Step10.添加代码。在main.c文件中,找到前面配置添加的两个任务函数,并在其中分别添加代码。PeriodicTask的功能是,每1秒钟发送一次信号量。HandleTask的功能的,等待信号量,然后翻转LED0和LED1的输出状态。Step11.编译下载运行。LED0和LED1分别闪烁,周期都是2秒。程序分析:1.分析语句:osSemaphoreDef(bSem01);和osThreadDef(…)类似,osSemaphoreDef(…)并不是一个函数,而是一个宏。其定义在cmsis_os.h文件中,作用是定义一个osSemaphoreDef_t结构体。2.分析语句:bSem01Handle = osSemaphoreCreate(osSemaphore(bSem01), 1);同样的,osSemaphore (…)也是一个宏定义,在cmsis_os.h文件中可查到。该语句的作用就是创建一个信号量,最后一个参数=1时,创建的就是一个二值信号量。3.HandleTask任务在执行osSemaphoreWait(bSem01Handle , osWaitForever);语句后,进入阻塞状态,等待PeriodicTask任务释放信号量。在实际运用中,二值信号量主要用于任务同步。如果把上面的PeriodicTask任务换成硬件定时器的ISR函数,那么HandleTask任务就相当于定时器的延迟处理函数。这是RTOS种常用的方法。因为RTOS调度本身使用了较低优先级的定时器中断实现,如果在硬件ISR中执行过多的代码,就会造成RTOS响应受到很大影响。因此,在ISR中只发送信号量,然后在其延迟处理函数中实现真正的用户功能。这本质上就是,将任务函数和硬件中断进行同步。需要注意的一点是,在原生的FreeRTOS中,信号量的发送和获取在ISR中要使用以FromISR结尾的特定函数。在STM32Cube生成的代码中,ST的工程师已经把接口进行了统一,在相应的函数中,通过查询程序状态寄存器判断当前是在ISR中还是在普通函数中。所以用户在使用时,统一使用osSemaphoreWait()和osSemaphoreRelease()函数操作即可。同样的,FreeRTOS的其他通信方式如队列、互斥量等,都进行了这样的处理。S.D.Lu于 深圳2016年8月
您可能关注的文档
最近下载
- 电商孵化园运营方案.pdf VIP
- 初中物理竞赛试题精选精编第07讲物态变化(含答案与解析).docx VIP
- ISO22000-2018 食品安全管理体系 食品链中各类组织的要求(可编辑可复制).docx VIP
- 初中物理竞赛试题精选精编第10讲质量与密度(含答案与解析).docx VIP
- 乡村振兴战略下红色旅游发展路径研究——以沂蒙革命老区为例.pdf VIP
- 四川建筑职业技术学院高等数学(一)复习答案学生版.doc VIP
- 《陈士铎医学全书》.doc VIP
- led灯具的结构基础知识.pdf VIP
- Yamaha雅马哈 CS-R5 英文说明书.pdf VIP
- 中信建投-金融-证券行业深度报告:券商-金融科技标的的弹性测算及对比.pdf VIP
文档评论(0)