当前位置: 首页 > article >正文

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

http://www.kler.cn/a/132960.html

相关文章:

  • 什么是SSL VPN?其中的协议结构是怎样的?
  • 基于SpringBoot的旅游网站(程序+数据库+报告)
  • GitLab 如何降级?
  • 网络安全练习之 ctfshow_web
  • 微信小程序 https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中
  • 常见的测试方法
  • linux运行java程序
  • 卷积神经网络(CNN)多种图片分类的实现
  • 21、Flink 的table API与DataStream API 集成(完整版)
  • 01_面向对象高级_static
  • MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,
  • springcloudalibaba-3
  • CAS源码工程搭建记录
  • 深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛
  • Django+vue前后端分离实战--vue后台管理系统--vue环境安装项目创建
  • Kotlin语言实现单击任意TextVIew切换一个新页面,并且实现颜色变换
  • 计算Qt中的QAudioOutput缓冲区未播放的音频字节数对应时长
  • centos 6.10 安装 perl 5.14
  • 设计测试用例的6种基本原则
  • MATLAB基础应用精讲-【数模应用】神经网络
  • Kafka、RocketMQ、RabbitMQ的比较总结Kafka、RocketMQ、RabbitMQ的比较总结
  • 一起Talk Android吧(第五百五十三回:解析Retrofit返回的数据)
  • 浅尝:iOS的CoreGraphics和Flutter的Canvas
  • HarmonyOS开发Java与ArkTS如何抉择
  • 【数据预处理2】数据预处理——数据标准化
  • C# using语句使用介绍