系统封装接口层 cmsis_os
2024-10-19 13:32:36
在这个实时操作系统泛滥的年代,有这么一个系统封装接口层还是蛮有必要的。前些时间偶然间在STM32最新的固件库中就发现了这个系统封装接口,当时就把自己所用的系统进行封装。直到最近KEIL5.0发现其中所到的RTX系统也进行了同相的封装。对比了下感觉很有必要和大家分享一下。
采用这个接口层写程序,基本上可以说不用再去管所用的是什么操作系统。相同的代码可以轻而易举的移植到不同的实时系统中。不敢说完全没有改动,但绝对是最少的。其简洁的书写手法,也会给我的应用层带来视觉上的体验感,使用可以尽可能去关注应用。
下面先用uCOS-II系统接口为例进行简单概述:
这里是主要的配置区,你所用到哪些功能用0或1来选择和取消。由于有些和系统中宏配置有相同意思的宏配置,所以我这里直接用了系统配置中的宏。
这是所用不同系统时的主要不同处。其他地方就很少会改动了。
下面来举例来说明如何简单的使用这个接口。
首先进入main函数,官方样例代码:
if (osKernelInitialize () != osOK) { // check osStatus for other possible valid values // exit with an error message } if (!osKernelRunning ()) { // is the kernel running ? if (osKernelStart () != osOK) { // start the kernel // kernel could not be started } }
进入首个函数中我们就需要建立任务
代码事例:
图上是RTX的接口代码所以,所用的栈地址,和栈大小有点不一样,uCOSII的是如下定义:
static uint32_t taskLedStk[TASK_LED_STK_SIZE] = {}; osThreadDef(TaskLed, TASK_LED_PRIO, taskLedStk, TASK_LED_STK_SIZE);
下面介绍信号量样例代码:
osSemaphoreDef(LED_CTRL); //定义信号量
osSemaphoreId osSem = NULL; //信号量句柄
osSem = osSemaphoreCreate(osSemaphore(LED_CTRL), ); //建立一个信号量 初值为0
osSemaphoreRelease(osSem); //释放一个信号量
定时回调函数事例代码:
#include "cmsis_os.h"
void Timer1_Callback (void const *arg); // prototypes for timer callback function
void Timer2_Callback (void const *arg);
osTimerDef (Timer1, Timer1_Callback); // define timers
osTimerDef (Timer2, Timer2_Callback);
uint32_t exec1; // argument for the timer call back function
uint32_t exec2; // argument for the timer call back function
void TimerCreate_example (void) {
osTimerId id1; // timer id
osTimerId id2; // timer id
// Create one-shoot timer
exec1 = ;
id1 = osTimerCreate (osTimer(Timer1), osTimerOnce, &exec1);
if (id1 != NULL) {
// One-shoot timer created
}
// Create periodic timer
exec2 = ;
id2 = osTimerCreate (osTimer(Timer2), osTimerPeriodic, &exec2);
if (id2 != NULL) {
// Periodic timer created
}
:
}
好了, 这些只大概的进行说明。如果想知道更多的内容,你可以考虑安装keil5.0。如下图可以看到所有接口讲解和使用方法。
下面分享 我封装的uCOSII,uCOSIII这两个系统接口。本人做过测试,相同的应用程序在这两个系统运行的到相同的效果。
uCOSII
uCOSIII
样例工程
最新文章
- Win8下安装.Net3.5的完美策略
- ToolStrip添加自定义的DateTimePicker
- 转: 关于Linux与JVM的内存关系分析
- c++ static及const(开发者在线)
- 普通SQL语句可以用Exec执行
- (转)Document对象内容集合
- arcmap+vs2010
- 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
- FZUOJ Problem 2178 礼品配送
- 换行符以及for循环的优化
- JavaFx的一些总结
- Docker-compose 多个Docker容器管理:以MYSQL和Wordpress为例
- Java权限访问修饰符
- Editor HDU - 4699 (栈)
- java核心技术笔记
- 冲刺博客NO.8
- was清除项目缓存数据
- Oracle性能优化1-总体思路和误区
- git 撤销本地修改
- 【转】【Mac】invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library
热门文章
- 12:Web及MySQL服务异常监测案例
- VLC Web插件的浏览器兼容性
- /dev/null简介
- WPF 后台任务 等待动画 样例 &;&; C# BackgroundWorker 详解
- ROS导航之地图costmap_2d与bresenham算法
- iOS --转载2018苹果$299美元企业级开发者账号申请攻略
- iOS --随机打乱一个数组的顺序 获得一个新的数组
- ubuntu16.04 一些简单软件安装操作
- 【BZOJ4771】七彩树 主席树+树链的并
- 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式