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);
	.....
	// 任务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);
		...
	}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#,数值计算——插值和外推,曲线插值(Curve_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Object for interpolating a curve specified by n points in dim dimensions. /// </summary> public class Curve_interp { private int dim { get; s…

openGauss通过VIP实现的故障转移

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

VisualGDB 6.0 R2 Crack

轻松跨平台"VisualGDB 使 Visual Studio 的跨平台开发变得简单、舒适。它支持&#xff1a; 准系统嵌入式系统和物联网模块&#xff08;查看完整列表&#xff09; C/C Linux 应用程序 本机 Android 应用程序和库 Raspberry Pi 和其他Linux 板 Linux 内核模块&#xff08;单…

【PTA题目】6-13 求叠数(递归版) 分数 10

6-13 求叠数(递归版) 分数 10 全屏浏览题目 切换布局 作者 李祥 单位 湖北经济学院 请编写递归函数&#xff0c;生成叠数。 例如&#xff1a;Redup(5,8)88888 函数原型 long long Redup(int n, int d); 说明&#xff1a;参数 n 为重复次数(非负整数)&#xff0c;d 为数字…

未来科技中的云计算之路

随着科技的不断发展&#xff0c;云计算已经不再是一个陌生的词汇&#xff0c;而是我们日常生活中不可或缺的一部分。从智能家居到无人驾驶&#xff0c;再到虚拟现实和人工智能&#xff0c;云计算在这些领域都扮演着至关重要的角色。在这篇博客中&#xff0c;我们将一同探索云计…

【如何学习Python自动化测试】—— 页面元素定位

接上篇自动化测试环境搭建&#xff0c;现在我们介绍 webdriver 对浏览器操作的 API。 2、 页面元素定位 通过自动化操作 web 页面&#xff0c;首先要解决的问题就是定位到要操作的对象&#xff0c;比如要模拟用户在页面上的输入框中输入一段字符串&#xff0c;那就必须得定位到…

UiPath Studio 2023.10 Crack

UiPath Studio是一款功能强大且用户友好的集成开发环境 (IDE)&#xff0c;专为机器人流程自动化 (RPA) 设计。它由自动化技术领域的领先公司UiPath开发。 以下是 UiPath Studio 的一些主要功能和组件&#xff1a; 图形用户界面 (GUI)&#xff1a;UiPath Studio 具有直观且用户友…

RT-Thread STM32F407 BMI088--SPI

BMI088是一款高性能6轴惯性传感器&#xff0c;由16位数字三轴24g加速度计和16位数字三轴2000/ s陀螺仪组成。 这里用SPI来驱动BMI088进行数据解读 第一步&#xff0c;首先在 RT-Thread Settings中进行配置 第二步&#xff0c;退出RT-Thread Settings&#xff0c;进入board.h…

数模建模竞赛——写作手三天速成(文末领取)

目录 第一天&#xff1a;准备论文模板&#xff0c;学习各类基础画图技巧 1、论文模板 2、基础画图能力 第二天&#xff1a;看按模型算法分类的优秀论文&#xff0c;学习其模型的写作方式 第三天&#xff1a;配合团队完成真题练习 第一天&#xff1a;准备论文模板&#xff…

【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;网络奇幻之旅 ⭐每日一句&#xff1a;往前走&#xff0c;朝着光 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f4cb;前…

嵌入式 Linux 移植与系统启动方法

1、Linux系统启动与U-Boot 所谓移植就是把程序代码从一种运行环境转移到另一种运行环境。对于内核移植来说&#xff0c;主要是从一种硬件平台转移到另一种硬件平台上运行。 体系结构级别的移植是指在不同体系结构平台上Linux内核的移植&#xff0c;例如&#xff0c;在ARM、MI…

【2023春李宏毅机器学习】生成式学习的两种策略

文章目录 1 各个击破2 一步到位3 两种策略的对比 生成式学习的两种策略&#xff1a;各个击破、一步到位 对于文本生成&#xff1a;把每一个生成的元素称为token&#xff0c;中文当中token指的是字&#xff0c;英文中的token指的是word piece。比如对于unbreakable&#xff0c;他…

【docker】iptables实现NAT

iptables是一个Linux内核中的防火墙工具&#xff0c;可以被用来执行各种网络相关的任务&#xff0c;如过滤、NAT和端口转发等&#xff0c;可以监控、过滤和重定向网络流量。 iptables可以用于以下应用场景&#xff1a; 网络安全&#xff1a;iptables可以过滤网络流量&#xf…

潇洒郎: 小白一次性成功——小米红米手机解BL锁+ ROOT-刷面具

一、账号与设备绑定 手机登录账号,绑定账号,使用手机卡流量,等待7天后解BL锁。 二、解BL锁 下载工具 申请解锁小米手机 (miui.com) https://www.miui.com/unlock/index.html 1、登录账号-与绑定的账号一样 2、驱动检测安装 驱动安装进入Fastboot模式后,会自动识别已连接…

【数据结构】树与二叉树(二十):树获取大儿子、大兄弟结点的算法(GFC、GNB)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子结点的算法&#xff08;GFC&#xff09;…

Linux-top命令解释

Linux-top命令解释 常用参数查看所有逻辑核的运行情况&#xff1a;1查看指定进程的情况&#xff1a;-p pid显示进程的完整命令&#xff1a;-c 面板指标解释第一行top第二行tasks第三行%Cpu第四行Mem第五行Swap第六行各进程监控PID&#xff1a;进程IDUSER&#xff1a;进程所有者…

“流量为王”的时代一去不返!如何押注互联网下一个黄金十年

目录 1“流量为王”的时代一去不返&#xff01;如何押注互联网下一个黄金十年 2AI夺走的第一份工作竟是OpenAI CEO&#xff1f;阿尔特曼被“扫地出门”&#xff0c;网友热评&#xff1a;是被GPT-5取代了吗&#xff1f;马斯克更“毒”&#xff0c;挂出求职申请链接 3GPT-4V新玩…

cocos 构建发布没有对话框

控制台log输出为何频频失踪?   wxss代码为何频频失效?   wxml布局为何乱作一团?   究竟是道德的沦丧?还是人性的缺失?   让我们一起来 走 跑进科学 前言 游戏审核了六个月终于通过了 我说改点东西再构建发布一版 点半天没反应 正文 1.打开项目目录 2.关闭cocosC…

Linux网络ssh服务

目录 一.ssh服务基础 1.ssh服务简介 2.ssh服务原理 二.ssh服务应用 1.ssh配置文件 2.ssh连接验证 三.ssh服务端 1.修改默认端口号 2.免密连接登录 3.禁止root用户登录 4.ssh服务的最佳实践 一.ssh服务基础 1.ssh服务简介 SSH&#xff1a;是一种安全通道协议&#x…

qtpdfium的编译及读取pdf文件和一些简单操作

qtpdfium是谷歌的一款开源项目&#xff0c;它的内核是基于国内的福昕pdf&#xff0c;许可协议为 BSD 3-Clause&#xff0c;允许用于闭源商业行为 下载 我们可以从git上进行下载&#xff0c;github&#xff0c;如果嫌下载速度慢&#xff0c;可以从csdn进行下载csdn 下载完成之…