CMSIS-RTOS在stm32使用

目录:

  • 一、安装和配置CMSIS_RTOS.
    • 1.打开KEIL工程,点击MANAGE RUN-TIME Environment图标。
    • 2.勾选CMSIS CORE和RTX.
    • 3.配置RTOS 时钟频率、任务栈大小和数量, 软件定时器.
  • 二、CMSIS_RTOS内核启动和创建线程。
    • 1.包含头文件。
    • 2.内核初始化和启动。
    • 3.创建线程。
  • 三、Signals、Semaphores信号量、互斥锁、消息队列、Memory pool、消息邮箱。
    • 1.Signals。
    • 2.Semaphores信号量。
    • 3.互斥锁
    • 4.消息队列
    • 5.Memory pool
    • 6.消息邮箱

一、安装和配置CMSIS_RTOS.

1.打开KEIL工程,点击MANAGE RUN-TIME Environment图标。

在这里插入图片描述

2.勾选CMSIS CORE和RTX.

在这里插入图片描述

3.配置RTOS 时钟频率、任务栈大小和数量, 软件定时器.

在这里插入图片描述

二、CMSIS_RTOS内核启动和创建线程。

1.包含头文件。

#include "cmsis_os.h"               // CMSIS RTOS header file

2.内核初始化和启动。

int main(){
osKernelInitialize ();                    // initialize CMSIS-RTOS
..do something..
osKernelStart (); while(1){}
}

3.创建线程。

osThreadId main_ID,led_ID1,led_ID2;
osThreadDef(led_thread2, osPriorityAboveNormal, 1, 0);
osThreadDef(led_thread1, osPriorityNormal, 1, 0);void led_thread1 (void const *argument) {}
void led_thread2 (void const *argument) {}int main(){osKernelInitialize ();                    // initialize CMSIS-RTOS// create 'thread' functions that start executing,led_ID1 = osThreadCreate(osThread(led_thread1), 0);led_ID2 = osThreadCreate(osThread(led_thread2), 0);osKernelStart (); while(1){}}

三、Signals、Semaphores信号量、互斥锁、消息队列、Memory pool、消息邮箱。

1.Signals。

每个线程有16个flag,任何线程也可以清除其它线程的信号.
int32_t osSignalSet ( osThreadId thread_id, int32_t signals);
int32_t osSignalClear ( osThreadId thread_id, int32_t signals);

在这里插入图片描述

eg:
1.设置信号
osSignalSet (led_ID2,0x01);
2.等待信号触发:
osSignalWait (0x01,osWaitForever);

2.Semaphores信号量。

	// 定义变量osSemaphoreId sem1;osSemaphoreDef(sem1);.....// 任务1void led_thread1 (void const *argument) {while(1){osSemaphoreRelease(sem1);...}}// 任务2void led_thread2 (void const *argument) {while(1){osSemaphoreWait(sem1, osWaitForever);....}}// 初始化int main(){...sem1 = osSemaphoreCreate(osSemaphore(sem1), 0);...}

3.互斥锁

	// 定义变量osMutexId uart_mutex;osMutexDef (uart_mutex);.....// 任务1void led_thread1 (void const *argument) {while(1){osMutexWait(uart_mutex, osWaitForever);...do something...osMutexRelease(uart_mutex); }}// 初始化int main(){...uart_mutex = osMutexCreate(osMutex(uart_mutex));...}

4.消息队列

	// 定义变量osMessageQId Q_LED;osMessageQDef (Q_LED,16_Message_Slots,unsigned int);osEvent result;.....// 任务1void led_thread1 (void const *argument) {while(1){osMessagePut(Q_LED,0x0,osWaitForever);...}}// 任务2void led_thread2 (void const *argument) {while(1){result = osMessageGet(Q_LED,osWaitForever);LED_data = result.value.v;....}}// 初始化int main(){...Q_LED = osMessageCreate(osMessageQ(Q_LED),NULL);...}

5.Memory pool

	// 定义变量typedef struct {uint8_t LED0;uint8_t LED1;uint8_t LED2;uint8_t  LED3;} memory_block_t;osPoolDef(led_pool,ten_blocks,memory_block_t);osPoolId( led_pool);// 任务1void led_thread1 (void const *argument) {while(1){*led_data = (memory_block_t *) osPoolAlloc(led_pool);led_data->LED0 = 0;led_data->LED1 = 1;led_data->LED2 = 2;led_data->LED3 = 3;osMessagePut(Q_LED,(uint32_t)led_data,osWaitForever);...}}// 任务2void led_thread2 (void const *argument) {osEvent event; memory_block_t * received;while(1){		event = osMessageGet(Q_LED,osWatiForever);*received = (memory_block *)event.value.p;led_on(received->LED0);....}}// 初始化int main(){...led_pool = osPoolCreate(osPool(led_pool));...}

6.消息邮箱

	typedef struct {uint8_t LED0;uint8_t LED1;uint8_t LED2;uint8_t LED3;} mail_format;osMailQDef(mail_box, sixteen_mail_slots, mail_format);osMailQId mail_box;// 任务1void led_thread1 (void const *argument) {while(1){LEDtx = (mail_format*)osMailAlloc(mail_box, osWaitForever);LEDtx->LED0 = led0[index];LEDtx->LED1 = led1[index];LEDtx->LED2 = led2[index];LEDtx->LED3 = led3[index];osMailPut(mail_box, LEDtx);...}}// 任务2void led_thread2 (void const *argument) {while(1){		evt = osMailGet(mail_box, osWaitForever); if(evt.status == osEventMail){LEDrx = (mail_format*)evt.value.p;LED_Out((LEDrx->LED0|LEDrx->LED1|LEDrx->LED2|LEDrx->LED3)<<8);osMailFree(mail_box, LEDrx);....}}// 初始化int main(){...mail_box = osMailCreate(osMailQ(mail_box), NULL);...}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/201863.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

振南技术干货集:制冷设备大型IoT监测项目研发纪实(4)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

基本的弹层,点击弹出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制弹框的显示隐藏visible .sync可以点击X关闭弹框 --> <el-dialog width"…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

2023年亚太地区数学建模大赛 问题B

玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;温室的设计通常采用带有温室风扇的通风系统&#xff0c;如…

Spark的通用运行流程与Spark YARN Cluster 模式的运行流程

Spark的通用运行流程 集群启动后Worker节点会向Master节点心跳汇报资源Client向Driver提交APP&#xff0c;根据不同的运行模式在不同的地方创建Driver。Driver以粗粒度的方式向Master注册应用并申请资源&#xff08;在Application执行之前&#xff0c;将所有的资源申请完毕&…

目标检测 Faster RCNN全面解读复现

Faster RCNN 解读 经过R-CNN和Fast RCNN的积淀&#xff0c;Ross B. Girshick在2016年提出了新的Faster RCNN&#xff0c;在结构上&#xff0c;Faster RCNN已经将特征抽取(feature extraction)&#xff0c;proposal提取&#xff0c;bounding box regression(rect refine)&…

好用的博客评论系统 Valine 使用及避坑指南

评论系统&#xff0c;即网站的一个小功能&#xff0c;展示评论内容和用户输入框。开源免费的评论系统可不多&#xff0c;原来很火的"多说"评论系统都关闭了&#xff0c;而Disqus又是国外的访问受限。无意间发现了Valine&#xff0c;挺不错的&#xff0c;分享给大家。…

智慧储能边缘计算网关应用,提升能源效率

智慧储能通过边缘计算网关物联网技术来实现对储能电池等设备的在线监控和远程管理。边缘计算网关可以将储能数据转化为可用的信息&#xff0c;并传输到储能系统中&#xff0c;为储能管理提供优化与调度等数据支持。 边缘计算网关在智慧储能系统中起到了关键的作用。IR4000边缘计…

接口自动化测试 —— 工具、请求与响应

一、工具&#xff1a; 1.工具介绍 postman &#xff1a;很主流的API测试工具&#xff0c;也是工作里面使用最广泛的研发工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安装postman&#xff1a; 安装好直接打开&#xff0c;不用注册。 二、通信模式&#xff1a; 1、…

学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型

文章目录 1. 总览2. 基础类型2.0 基础类型总览2.1 cv::Vec<>类2.2 cv::Matx<>类2.3 cv::Point类(cv::Point3_< >和cv::Point_< >)2.4 cv::Scalar(cv::Scalar_)类2.5 cv::Size(cv::Size_)类、cv::Rect(cv::Rect_)类和cv::RotatedRect 类2.6 基础类型…

『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 数据库产品类别 01、Amazon Aurora 02、Amazon Docum…

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

Stable Diffusion专场公开课

从SD原理、本地部署到其二次开发 分享时间&#xff1a;11月25日14&#xff1a;00-17&#xff1a;00 分享大纲 从扩散模型DDPM起步理解SD背后原理 SD的本地部署:在自己电脑上快速搭建、快速出图如何基于SD快速做二次开发(以七月的AIGC模特生成系统为例) 分享人简介 July&#…

git stash 用法总结

目录 1&#xff0c;介绍场景1&#xff1a;场景2&#xff1a; 2&#xff0c;常用命令2.1&#xff0c;基础2.2&#xff0c;进阶1&#xff0c;存储时指定备注2&#xff0c;通过索引来操作指定的存储3&#xff0c;修改存储规则 2.3&#xff0c;查看 stash 修改的具体内容 1&#xf…

(动手学习深度学习)第13章 实战kaggle竞赛:狗的品种识别

文章目录 1. 导入相关库2. 加载数据集3. 整理数据集4. 图像增广5. 读取数据6. 微调预训练模型7. 定义损失函数和评价损失函数9. 训练模型 1. 导入相关库 import os import torch import torchvision from torch import nn from d2l import torch as d2l2. 加载数据集 - 该数据…

【算法】链表-20231123

这里写目录标题 一、19. 删除链表的倒数第 N 个结点二、21. 合并两个有序链表三、24. 两两交换链表中的节点 一、19. 删除链表的倒数第 N 个结点 提示 中等 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 输入&#xff1a;head [1,…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

【计算机网络笔记】路由算法之层次路由

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

推荐一款适合做智慧旅游的前端模板

目录 前言 一、功能介绍 二、前端技术介绍 三、功能及界面设计介绍 1、数据概览 2、车辆监控 3、地图界面 4、其它功能 四、扩展说明 总结 前言 智慧旅游是一种全新的旅游业务模式&#xff0c;它充分利用先进的信息技术&#xff0c;提升旅游体验&#xff0c;优化旅游管…

【JavaEE】Spring更简单的存储和获取对象(类注解、方法注解、属性注入、Setter注入、构造方法注入)

一、存储Bean对象 在这篇文章中我介绍了Spring最简单的创建和使用&#xff1a;Spring的创建和使用 其中存储Bean对象是这样的&#xff1a; 1.1 配置扫描路径 想要成功把对象存到Spring中&#xff0c;我们需要配置对象的扫描包路径 这样的话&#xff0c;就只有被配置了的包…