betway88必威体育
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » uC/OS环境下的C语言编程(PLD转)

共1条 1/1 1 跳转至

uC/OS环境下的C语言编程(PLD转)

菜鸟
2002-05-16 19:09:03     打赏
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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]