CMSIS-RTOS在stm32使用

news2025/1/16 18:00:46

目录:

  • 一、安装和配置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);
	.....
	// 任务1
	void led_thread1 (void const *argument) {
		while(1){
			osSemaphoreRelease(sem1);
			...
		}
	}
	// 任务2
	void led_thread2 (void const *argument) {
		while(1){
			osSemaphoreWait(sem1, osWaitForever);
			....
		}
	}
	// 初始化
	int main(){
		...
		sem1 = osSemaphoreCreate(osSemaphore(sem1), 0);
		...
	}

3.互斥锁

	// 定义变量
	osMutexId uart_mutex;
	osMutexDef (uart_mutex);
	.....
	// 任务1
	void 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;
	.....
	// 任务1
	void led_thread1 (void const *argument) {
		while(1){
			osMessagePut(Q_LED,0x0,osWaitForever);
			...
		}
	}
	// 任务2
	void 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);
	
	// 任务1
	void 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);
			...
		}
	}
	// 任务2
	void 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;
	
	// 任务1
	void 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);
			...
		}
	}
	// 任务2
	void 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.coloradmin.cn/o/1225313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,

1.MySQL 1.1.正确写法 select * from student where find_in_set(s_id, 1,2,3); 1.2.错误示范 select * from student where find_in_set(s_id, 1,2 ,3); -- 注意&#xff0c;中间不能有空格。1、3 select * from student where find_in_set(s_id, 1,2, 3); -- 注意…

快速搜索多个word、excel等文件中内容

如何快速搜索多个word、excel等文件中内容 操作方法 以win11系统为介绍对象。 首先我们打开“我的电脑”-->“文件夹选项”-->“搜索”标签页,在“搜索内容”下方选择&#xff1a;"始终搜索文件名和内容&#xff08;此过程可能需要几分钟&#xff09;"。然后…

浏览器黑暗模式插件

1.Opera浏览器本身黑暗主题 2.Chrome 3.Edge

JRC Monthly Water History, v1.4数据集

简介&#xff1a; JRC Monthly Water History产品&#xff0c;是利用1984至2020年获取的landsat5、landsat7和landsat8的卫星影像&#xff0c;生成的一套30米分辨率的全球地表水覆盖的月度地表水监测地图集。该数据集共有442景数据&#xff0c;包含1984年3月至2020年12月间的月…

Python大数据之linux学习总结——day09_hive调优

hive调优 hive官方配置url: https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮…

图新地球地图导入操作步骤

1、下载图源&#xff0c;如下&#xff1a; 2、将其全部复制或部分复制&#xff0c;然后回到桌面&#xff0c;打开文件所在位置&#xff0c;如下&#xff1a; 3、将复制的数据粘贴到文件夹下&#xff0c;具体如下&#xff1a; 4、复制到路径如下&#xff1a; 5、复制结果如下&am…

记一次解决Pyqt6/Pyside6添加QTreeView或QTreeWidget导致窗口卡死(未响应)的新路历程,打死我都想不到是这个原因

文章目录 💢 问题 💢🏡 环境 🏡📄 代码💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 我在窗口中添加了一个 QTreeWidget控件 ,但是程序在运行期间,只要鼠标进入到 QTreeWidget控件 内进行操作,时间超过几秒中就会出现窗口 未响应卡死的 状态 🏡 环境 �…

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

在这篇博客中&#xff0c;我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作&#xff0c;还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能&#xff0c;我们将更全面地理解这个程序的实现。 资源获取&a…

微信(小程序开发): 解决播放音乐没有声音的情况 代码不报错的情况下依旧没有声音的解决方案

解决无声的问题 在此之前&#xff0c;确保代码能够正常执行哈&#xff01;发这个其实没什么&#xff0c;就是有些人光写代码不调试出现了这个问题 其实解决方法特别简单 第一步&#xff1a; 打开项目后&#xff0c;点击三个点&#xff0c;然后选择模拟操作 第二步&#xff…

nodejs微信小程序-慢性胃炎健康管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

rollout

构建 测试 代码扫描 打包 打镜像 推送镜像 部署应用 Rollout 是 Kubernetes 中用于管理部署应用的资源对象。它通过控制多个 ReplicaSets 对象的创建、缩放和更新&#xff0c;以实现无宕机升级和回滚应用程序版本的能力。 一般来说&#xff0c;在 Kubernetes 中&#xff0c;我…

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!

之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui&#xff0c;支持 VmessWSTLS。 最近 Docker 视频出的比较多&#xff0c;前阵子又出现了宝塔国内版存在隐私泄露的问题&#xff0c;很多小伙伴其实都不用宝塔了&#xff0c;那么&#xff0c;在我们现在…

分支限界法(1)--旅行商问题

一、概述 有n个城市&#xff0c;旅行者要访问所有n个城市&#xff0c;最终回到起始点&#xff0c;假设起始点给定为1&#xff0c;城市间距离已知&#xff0c;求能够完成旅行的最短距离。题干如下图。 算法&#xff1a;分支限界法&#xff0c;使用队列进行bfs搜索。 二、代码 i…

AIGC 是通向 AGI 的那条路吗?

AIGC 是通向 AGI 的那条路吗&#xff1f; 目录 一、背景知识 1.1、AGI&#xff08;人工通用智能&#xff09; 1.1.1、概念定义 1.1.2、通用人工智能特质 1.1.3、通用人工智能需要掌握能力 1.2、AIGC 二、AIGC 是通向 AGI 的那条路吗&#xff1f; 三、当前实现真正的 A…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的&#xff0c;svg画布只是用于展示svg世界中某一个范围的内容&#xff0c;而对于超过了svg画布范围的内容&#xff0c;则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

组合模式 rust和java的实现

文章目录 组合模式介绍实现javarsut 组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计…

Flutter笔记:桌面端应用多窗口管理方案

Flutter笔记 桌面端应用多窗口管理方案 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…

python算法例10 整数转换为罗马数字

1. 问题描述 给定一个整数&#xff0c;将其转换为罗马数字&#xff0c;要求返回结果的取值范围为1~3999。 2. 问题示例 4→Ⅳ&#xff0c;12→Ⅻ&#xff0c;21→XⅪ&#xff0c;99→XCIX。 3. 代码实现 def int_to_roman(num):val [1000, 900, 500, 400,100, 90, 50, 40…