共1条
1/1 1 跳转至页
主题:uC/OS环境下的C语言编程(转载)
发信人: 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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |