CMSIS-RTOS在stm32使用

目录:

一、安装和配置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);
		...
	}
相关推荐
三易串口屏22 分钟前
实验20 自动灭火场景实验
嵌入式硬件·串口屏·三易串口屏·uart 通信
蒸蛋一级爱好者39 分钟前
TFTP协议
单片机·嵌入式硬件
优信电子1 小时前
STM32/C51驱动 DHTC11 温湿度传感器
stm32·单片机·嵌入式硬件·c51·温湿度传感器·dhtc11·环境测量
QiLinkOS1 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
周周记笔记1 小时前
【元器件专题】三极管-如果B极给一个方波信号,那么V0输出也可以设计为一个方波信号
单片机·嵌入式硬件
潜创微科技2 小时前
IT68353:DP 1.4 + HDMI 2.0 + USB-C 三合一转 HDMI 2.0 单芯片KVM切换方案
嵌入式硬件·音视频
HPT_Lt2 小时前
ZCC10012支持100V/1.2A 超低静态电流同步降压转换器 兼容LM5164
单片机·嵌入式硬件
Industio_触觉智能2 小时前
瑞芯微RK3576车载智能场景之ADAS+DMS+NVR
嵌入式硬件·dms·adas·nvr·rk3576·车载智能
2zcode3 小时前
基于STM32的多功能万年历电子闹钟设计与实现
stm32·单片机·嵌入式硬件
一抹晴空3 小时前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机