一起来学习 系统封装接口层- CMSIS-OS 之freeRTOS

  在这个实时操作系统泛滥的年代,有这么一个系统封装接口层还是蛮有必要的。前些时间偶然间在STM32最新的固件库中就发现了这个系统封装接口,当时就把自己所用的系统进行封装。直到最近KEIL5.0发现其中所到的RTX系统也进行了同相的封装。对比了下感觉很有必要和大家分享一下。

         采用这个接口层写程序,基本上可以说不用再去管所用的是什么操作系统。相同的代码可以轻而易举的移植到不同的实时系统中。不敢说完全没有改动,但绝对是最少的。其简洁的书写手法,也会给我的应用层带来视觉上的体验感,使用可以尽可能去关注应用。

 首先这里整理下CMSISOS-FREERTOS 的API如下:

FreeRTOS 封装后的 API

 


内核控制函数

 

 

osStatus osKernelStart (void);

//内核开始运行

 

int32_t osKernelRunning(void);

//返回值为 1 表示正在运行 作用:系统是否正常工作

uint32_t osKernelSysTick (void);

//系统当前节拍数

作用:毫秒级计时

osKernelSysTickMicroSec(microsec)

//微妙(宏函数)

作用:微秒级计时

线程管理函数

osThreadDef(name, thread, priority, instances, stacksz)//(宏函数) 作用:定义 osThreadDef_t 结构体

osThread(name)//(宏函数)作用:获取 os_thread_def_##name 结构体的指针

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);//创建线程,错误返回 NULL

osThreadId osThreadGetId (void);//返回当前线程

osStatus osThreadTerminate (osThreadId thread_id); //终结线程

osStatus osThreadYield (void);//调度一次

osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority); //设置线程优先级 osPriority osThreadGetPriority (osThreadId thread_id); //获取线程优先级

 

等待函数

 

osStatus osDelay (uint32_t millisec);//毫秒级延时

osEvent osWait (uint32_t millisec);//未实现

 

信号量管理函数

 

osSemaphoreDef(name)//(宏函数) 作用:定义 os_semaphore_def_##name 结构体


osSemaphore(name)//(宏函数) 作用:定义 os_semaphore_def_##name 结构体的指针

osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count);//创建信号量

int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec);//信号量减一

osStatus osSemaphoreRelease (osSemaphoreId semaphore_id);//信号量加一

osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);//删除信号量

 


互斥锁管理函数

 

 

 

osMutexDef(name)

//(宏函数)

作用:定义 os_mutex_def_##name 结构体

osMutex(name)

//宏函数

作用:定义 os_mutex_def_##name 结构体的指针

osMutexId osMutexCreate (const osMutexDef_t *mutex_def);

//创建互斥锁

osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec); //锁定互斥锁

osStatus osMutexRelease (osMutexId mutex_id);

//解锁互斥锁

osStatus osMutexDelete (osMutexId mutex_id);

//删除互斥锁


队列管理函数

 

osMessageQDef(name, queue_sz, type) //参数二:队列 size 参数三:成员 size 作用:定义

 

os_messageQ_def_##name 结构体

 

osMessageQ(name)//宏函数作用:定义 os_messageQ_def_##name 结构体的指针

 

osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id);//创建队列

 

osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);

//向队列中放入消息

osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec);

//从队列中获取消息

邮箱队列管理函数

 

 

 

 

 

osMailQDef(name, queue_sz, type) //参数二:邮箱 size 参数三:消息 size

作用:定义 os_mailQ_def_##name

结构体

 

 

 

 

 

osMailQ(name)

//宏函数

作用:定义 os_mailQ_def_##name 结构体的指针

osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id);

//创建邮箱

void *osMailAlloc (osMailQId queue_id, uint32_t millisec);

//分配一个消息的空间

 

void *osMailCAlloc (osMailQId queue_id, uint32_t millisec);

//分配一个消息的空间并且清零

osStatus osMailPut (osMailQId queue_id, void *mail);

//将成员丢到邮箱中

 

osEvent osMailGet (osMailQId queue_id, uint32_t millisec);

//从邮箱中获取消息

 

osStatus osMailFree (osMailQId queue_id, void *mail);

//释放消息空间

 

 

 

 

软件定时器管理函数

 

osTimerDef(name, function)//宏函数作用:定义 os_timer_def_##name 结构体

 

osTimer(name)//宏函数作用:定义 os_timer_def_##name 结构体的指针

 

osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument);//参数二:是否

 

重复回调 作用:创建软件定时器

 

 

 

 

osStatus osTimerStart (osTimerId timer_id, uint32_t millisec);

//开始定时

 

osStatus osTimerStop (osTimerId timer_id);

//停止定时

 

osStatus osTimerDelete (osTimerId timer_id);

//删除定时器

 

信号管理函数

 

 

 

 

int32_t osSignalSet (osThreadId thread_id, int32_t signals);

//带通知值的任务通知

 

int32_t osSignalClear (osThreadId thread_id, int32_t signals);

//未实现

 

osEvent osSignalWait (int32_t signals, uint32_t millisec);

//参数二:取出值后位置零 作用:等待通知到来

内存池管理函数

 

 

 

 

osPoolDef(name, no, type)

//参数二:内存池 size 参数三:成员 size

作用:定义

os_pool_def_##name 结构体

 

 

 

 

osPool(name)

//宏函数

作用:定义 os_pool_def_##name 结构体的指针

osPoolId osPoolCreate (const osPoolDef_t *pool_def);    //创建内存池

 

void *osPoolAlloc (osPoolId pool_id);

 

//分配内存

 

void *osPoolCAlloc (osPoolId pool_id);

 

//分配内存并且清零

 

osStatus osPoolFree (osPoolId pool_id, void *block);

//释放内存

 


特殊功能函数

 

 

 

 

void osSystickHandler(void);

//定时器中断处理函数

 

osThreadState osThreadGetState(osThreadId thread_id);

//获取线程状态

osStatus osThreadIsSuspended(osThreadId thread_id);

 

//线程是否被挂起

osStatus osThreadSuspend (osThreadId thread_id);

 

//挂起线程

osStatus osThreadResume (osThreadId thread_id);

 

//恢复调度

osStatus osThreadSuspendAll (void);

 

 

//挂起所有线程

 

osStatus osThreadResumeAll (void);

 

//恢复调度所有线程

osStatus osDelayUntil (uint32_t *PreviousWakeTime, uint32_t millisec);

//绝对延时

osStatus osThreadList (uint8_t *buffer);

 

 

//获取任务信息 任务名、优先级

osEvent osMessagePeek (osMessageQId queue_id, uint32_t millisec);

//瞥一眼队列中有没有消息

osMutexId osRecursiveMutexCreate (const osMutexDef_t *mutex_def);

//创建递归互斥锁

osStatus osRecursiveMutexRelease (osMutexId mutex_id);

//释放递归互斥锁

osStatus osRecursiveMutexWait (osMutexId mutex_id, uint32_t millisec);

//锁定递归互斥锁

  

         下面先用FreeRTOS系统接口为例进行简单概述:
 


图片

图片
这里是主要的配置区,你所用到哪些功能用0或1来选择和取消。由于有些和系统中宏配置有相同意思的宏配置,所以我这里直接用了系统配置中的宏。

 

图片
这是所用不同系统时的主要不同处。其他地方就很少会改动了。

下面来举例来说明如何简单的使用这个接口。

首先进入main函数:





 更多接受可以如下方法进去官网查看CMSIS-OS API使用


图片

图片

 

  


发布了11 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/cornrn/article/details/72473845