没有合适的资源?快使用搜索试试~ 我知道了~
建立一个属于自己的 AVR 的 RTOS Proteus6.7 可以用来模拟仿真 avr 系列的单片机 WinAVR v2.0.5.48 基于 GCC AVR 的编译环境,好处在于可以在 C 语言中插入 asm 的语句 mega8 1K 的 ram 有 8K 的 rom,是开发 8 位的 RTOS 的一个理想的器件,并且我对它也比较 熟悉。 写 UCOS 的 Jean J.Labrosse 在他的书上有这样一句话,“渐渐地,我自然会想到,写个实时 内核直有那么难吗?不就是不断地保存,恢复 CPU 的那些寄存器嘛。”
资源推荐
资源详情
资源评论
www.ourdev.cn
建立一个属于自己的 AVR 的 RTOS
作者:黄健昌
整理:喜马啦呀
www.ourdev.cn
目录
序 ...................................................................................................................................................... 3
第一篇:函数的运行....................................................................................................................... 4
第二篇:人工堆栈........................................................................................................................... 7
第三篇:GCC 中对寄存器的分配与使用 ....................................................................................... 9
第四篇:只有延时服务的协作式的内核 ..................................................................................... 12
第五篇:完善的协作式的内核 ..................................................................................................... 17
第六篇:时间片轮番调度法的内核 ............................................................................................. 25
第七篇:占先式内核(只带延时服务) .......................................................................................... 30
第八篇:占先式内核(完善的服务) .............................................................................................. 37
结束语 ............................................................................................................................................ 48
www.ourdev.cn
序
序
自从 03 年以来,对单片机的 RTOS 的学习和应用的热潮可谓一浪高过一浪.03 年,在离开
校园前的,非典的那几个月,在华师的后门那里买了本邵贝贝的《UCOSII》,通读了几次,
没有实验器材,也不了了之。
在 21IC 上,大家都可以看到杨屹写的关于 UCOSII 在 51 上的移植,于是掀起了 51 上的 RTOS
的热潮。
再后来,陈明计先生推出的 small rots,展示了一个用在 51 上的微内核,足以在 52 上进
行任务调度。
前段时间,在 ouravr 上面开有专门关于 AVR 的 Rtos 的专栏,并且不少的兄弟把自己的作
品拿出来,着实开了不少眼界。这时,我重新回顾了使用单片机的经历,觉得很有必要,从
根本上对单片机的 RTOS 的知识进行整理,于是,我开始了编写一个用在 AVR 单片机的 RTOS。
当时,我所有的知识和资源有:
Proteus6.7 可以用来模拟仿真 avr 系列的单片机
WinAVR v2.0.5.48 基于 GCC AVR 的编译环境,好处在于可以在 C 语言中插入 asm 的语句
mega8 1K 的 ram 有 8K 的 rom,是开发 8 位的 RTOS 的一个理想的器件,并且我对它也比较
熟悉。
写 UCOS 的 Jean J.Labrosse 在他的书上有这样一句话,“渐渐地,我自然会想到,写个实时
内核直有那么难吗?不就是不断地保存,恢复 CPU 的那些寄存器嘛。”
好了,当这一切准备好后,我们就可以开始我们的 Rtos for mega8 的实验之旅了。
本文列出的例子,全部完整可用。只需要一个文件就可以编译了。我相信,只要适当可用,
最简单的就是最好的,这样可以排除一些不必要的干扰,让大家专注到每一个过程的学习。
www.ourdev.cn
第一篇:函数的运行
第一篇:函数的运行
在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。
例子如下:
makefile 的设定:运行 WinAvr 中的 Mfile,设定如下
MCU Type: mega8
Optimization level: s
Debug format :AVR-COFF
C/C++ source file: 选译要编译的 C 文件
#include <avr/io.h>
void fun1(void)
{
unsigned char i=0;
while(1)
{
PORTB=i++;
PORTC=0x01<<(i%8);
}
}
int main(void)
{
fun1();
}
首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗?
相信学习过 C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,
如果大家都和我一样,当初的教科书是谭浩强先生的《C 程序设计》的话,请找回书的第 9.5
节。
例子:用函数指针变量调用函数
#include <avr/io.h>
void fun1(void)
{
unsigned char i=0;
while(1)
{
www.ourdev.cn
PORTB=i++;
PORTC=0x01<<(i%8);
}
}
void (*pfun)(); //指向函数的指针
int main(void)
{
pfun=fun1; //
(*pfun)(); //运行指针所指向的函数
}
第二种,是“把指向函数的指针变量作函数参数”
#include <avr/io.h>
void fun1(void)
{
unsigned char i=0;
while(1)
{
PORTB=i++;
PORTC=0x01<<(i%8);
}
}
void RunFun(void (*pfun)()) //获得了要传递的函数的地址
{
(*pfun)(); //在 RunFun 中,运行指针所指向的函数
}
int main(void)
{
RunFun(fun1); //将函数的指针作为变量传递
}
看到上面的两种方式,很多人可能会说,“这的确不错”,但是这样与我们想要的 RTOS,
有什么关系呢?各位请细心向下看。
以下是 GCC 对上面的代码的编译的情况:
对 main()中的 RunFun(fun1); 的编译如下
ldi r24,lo8(pm(fun1))
剩余47页未读,继续阅读
资源评论
lkang1029
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功