共1条
1/1 1 跳转至页
uC/OS环境下的C语言编程(PLD转)
uC/OS环境下的C语言编程(转摘) 精华
PLD 于 2002/04/21 11:44 加贴在 嵌入式系统论坛 删除
一下内容转载自白云黄鹤 VBS
UC/OS-II环境下的C语言编程
一、 变量类型
由于C语言的变量类型的长度是与编译器类型相关的,UC/OS考虑到在各个平台的可移植
性,没有使用C语言的数据类型,而是定义了自己的数据类型。(定义在OS_CPU.H)具体
的变量类型如下:
类型代码 类型 宽度
BOOLEAN 布尔型 8
INT8U 8位无符号整数 8
INT8S 8位有符号整数 8
INT16U 16位无符号整数 16
INT16S 16为有符号整数 16
INT32U 32位无符号整数 32
INT32S 32位有符号整数 32
FP32 单精度浮点数 32
FP64 双精度浮点数 64
二、 任务函数的编写
象DOS程序的main函数一样,UC/OS的任务也是从某一个函数开始执行的,只不过与DOS程
序不同的是,UC/OS的函数名不是规定的main,而是可以由用户确定的。当然,如果你希
望UC/OS能够在运行时装载文件中的任务,你可能只能用main这个函数名了。不过要支持
上面的这个功能,还有必要扩展UC/OS的TaskCreate()和TaskCreateExt()函数呢。
1. 任务函数的结构形式:任务看起来和普通的C语言函数一样,有返回类型和一个参数
,只是函数从来不返回。由于UC/OS是多任务系统,加上任务函数从来不能返回,所以任
务只能是一个无限循环或者执行一次就被删除掉,故函数只能是下面的2种结构之一:
void YourTask(void *pdata) {
任务初始化代码;
for(;;) {
用户代码;
/*调用UC/OS的服务函数之一*/
OSMboxPend();
OSQPend();
OSSenPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();
OSTimeDlyHMSM();
用户代码;
}
}
或者
void YourTask(void *pdata) {
用户代码;
OSTaskDel(OS_PRIO_SELF);
}
对于只执行一次的任务用第二中形式,对于要执行很多次的任务就要用第一种形式,但
是他们都有一个共同点,都需要一个UC/OS的系统调用来保证函数不返回和让出CPU资源
。上面的第二种形式很象DOS下的顺序程序设计,第二种形式就很像windows下的基于消
息驱动的程序设计了(我不是很清楚windows下的程序是在循环的检测消息的到来,还是
在等待消息的到来,有的书上说是前者,但是我的理解和从实际的运行情况看,应该是
后者,要不Microsoft就是大傻X了)。
另外还要说一下的是,函数中的参数 *pdata;这个是UC/OS传递给任务的参数,就象DOS程
序设计中main函数的argv 和argc,只不过这里只能传一个参数了。
2. 全局的变量和代码重用:
因为DOS是一个单任务操作系统,所以编程时不用考虑代码的重用,但是在UC/OS这样的
多任务内核下面,就该考虑代码重用了。也就是任务函数可重入。其实保证可重入很简
单,就是不用全局变量。因为每个任务的局部变量都是放在当前的任务堆栈中的,而任
务堆栈是独立的,所以只要不用全局变量就可以保证代码重用了。
3. 类似于windows下消息驱动的程序的实现(这部分内容我也只是一个设想,欢迎大家
讨论)
windows编程比较容易,第一是因为C++的面向对象编程,另外一个我想就是windows本身
的消息驱动机制了。前者保护了数据,而后者帮程序员处理了很复杂的程序逻辑。在其
他的OS下面也有基于事件驱动的机制,但是比起windows下面的消息驱动来说,功能上要
小多了。UC/OS也有事件驱动的机制,利用他的这个机制,编写类似于windows下的消息
驱动的程序是可行的。
其实具体的实现就是利用UC/OS的消息队列。这样,在编写你的任务代码时,先做完任务
的初始化,然后在消息循环中就wait在一个消息上面,然后当其他任务或者中断服务程
序发消息来后,根据消息的内容调用相应的函数模块,函数调用后又回到消息循环,继
续等待消息。
任务函数的样子
void YourTask(void * pdata)
{
init();/*任务初始化
for(;;)
{ /*消息循环
OSQPend();
Switch(Qresult)
{
}
}
}
4.示例
因为看UC/OS还没有多久,也没有实际的做过事情,下面根据BBS上的有关数据采集的
问题写写我设想的任务函数。
Void myTask(void *pada) {
Collect_rate=50; /* set the rate of collecting
StartCollect(); /* start the collecting
For(;;)
{
OSSemPost(); /* wait for a interrupt from the A/D collecter
HandleCollect(); /* Handle the data from the A/D collecter
}
}
三、 系统调用
请参考《UC/OS-II——源代码开放的实时嵌入式操作系统》第11章。
----------------------------------------------------------------------
谢谢PLD!!!
关键词: 环境 语言编程 代码 任务 函数 消息
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |