OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 主题:uC/OS环境下的C语言编程(转载)

共1条 1/1 1 跳转至

主题:uC/OS环境下的C语言编程(转载)

院士
2002-09-06 18:56:00    评分
发信人: vbs (哈哈儿), 信区: Embedded 标 题: uC/OS环境下的C语言编程 发信站: 武汉白云黄鹤站 (2002年04月18日02:12:35 星期四), 站内信件 在和同学一起做毕业设计,我负责uC/OS和tcp/ip stack部分。为了 双方能够更好的协调,特写了以下的一些东西。需要说明的是,有 很多东西都只是我自己想的,没有实践过。有问题的地方希望大家 提出来一起讨论。下面的内容是从word文档贴过来的,格式可能不 好看,感兴趣的可以到http://202.114.20.22/forum/badboy.php 的相应的文章里面下载到word文档。 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章。 -- ※ 修改:·vbs 於 04月18日02:12:56 修改本文·[FROM: 202.114.20.114] ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·[FROM: 202.114.20.114] ※ 作 者: 白云黄鹤 02-4-28 9:46:25 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 终于找到和我做同样工作的人了。 多联系,我的mail:wanderzhd@263.net ※ 作 者: wanderzhd 02-7-8 17:12:22 ※ Re:Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 请问,您是否在AT mega128 上移植过uC/OS,给个联系方式共同探讨以下。zhzhoo@263.net 0755-83176712 詹 ※ 作 者: zhan 02-7-12 11:09:28 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 UC/OS-II 并不支持轮转调度算法。有没有这个可能下一版本就可以有这个调度方法了 在这之前我想问一问 轮转和强占之间怎样切换。假如轮转时被打断进入抢占。打断时一个任务的时间片没有用完。下一次再次轮转时(没有更高的级别了)应该还是它先运行吧?时间片应该是没有用完的那么多吗? ※ 作 者: richardhe 02-8-2 17:05:45 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 根据你文中所述,uC/OS是个多任务环境,TaskCreate()和TaskCreateExt()函数无类型返回,但是我们可以在任务中开辟一共享内存段,由于保存任务间数据交换。 ※ 作 者: drogy 02-8-21 9:42:49 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 let do it together ※ 作 者: hongwind 02-9-3 8:42:52 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 请问uC/os系统从哪里能得到免费的。 ※ 作 者: baokejin 02-9-3 22:02:26 ※ Re:uC/OS环境下的C语言编程(转载) <--- 〖回复该帖子〗 . "类似于windows下消息驱动的程序的实现"我也想这样做,其依据是很多操作系统所提供的任务间通讯机制:消息队列。 ※ 作 者: 1111 02-9-4 11:15:56 ※ 作为学生能理解到这样, 很不错. 关于windows编程容易, 我有不同的解释 <--- 〖回复该帖子〗 "C++保护了数据" 这要看你从哪个角度看, 被保护的数据是object里面的, 但如果object本身不是局部变量, 也就没有保护了. 只是大多数windows程序只有一个thread, 所以问题不会出现, 试着用多个thread来使用同一个object就知道了. ※ 作 者: coder 02-9-4 14:27:56



关键词: 主题     环境     语言编程     转载     代码     任务     函数     消息    

共1条 1/1 1 跳转至

回复

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