CMSIS-RTOS在stm32使用

2023-11-22 22:30
文章标签 使用 stm32 rtos cmsis

本文主要是介绍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);...}

这篇关于CMSIS-RTOS在stm32使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413357

相关文章

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个