没有合适的资源?快使用搜索试试~ 我知道了~
首页AVR单片机RTOS实战教程:从零开始到协作式内核
AVR单片机RTOS实战教程:从零开始到协作式内核
需积分: 9 4 下载量 186 浏览量
更新于2024-07-18
收藏 539KB PDF 举报
本文主要探讨了AVR嵌入式实时操作系统(RTOS)的设计与实现,特别是针对Atmel公司的AVR系列单片机,如mega8,该单片机具有1KB的RAM和8KB的ROM,这对于8位RTOS的开发是一个理想的平台。作者黄健昌在文章中分享了他的学习历程,提到他受到了UCOS内核作者Jean J. Labrosse的启发,认识到RTOS内核的核心实际上就是管理和复位CPU寄存器的工作。 文章分为八个部分展开: 1. 函数的运行:介绍单片机中通常采用后台处理方式(通过大循环和中断),这是RTOS的基础,因为RTOS需要高效地协调任务间的执行。 2. 人工堆栈:在RTOS中,堆栈管理至关重要,特别是在AVR这样的资源有限的环境中,正确使用堆栈可以确保任务切换的顺利进行。 3. GCC中对寄存器的分配与使用:强调了在使用WinAVR的GCC编译环境下,如何有效地利用C语言和汇编指令来操作寄存器,这对RTOS的性能优化很重要。 4-6. 协作式内核:首先讨论了只有延时服务的协作式内核,随后逐步发展到完善的协作式内核,涉及任务的同步、通信和调度机制。 7-8. 时间片轮番调度法和占先式内核:这两种高级调度策略,前者按时间片轮流执行任务,后者则优先处理优先级高的任务,提高了系统的响应速度和任务执行效率。 文章的目标是通过一个实际的、易于理解的示例,帮助读者构建自己的RTOS系统,避免复杂性带来的干扰,专注于每个阶段的学习。此外,文章还提供了一个完整可用的示例源码,可供读者直接实践,从而快速入门AVR单片机的RTOS设计。
资源详情
资源推荐
www.ourdev.cn
第三篇:GCC 中对寄存器的分配与使用
在很多用于 AVR 的 RTOS 中,都会有任务调度时,插入以下的语句:
入栈:
__asm__ __volatile__("PUSH R0\t");
__asm__ __volatile__("PUSH R1\t");
......
__asm__ __volatile__("PUSH R31\t");
出栈
__asm__ __volatile__("POP R31\t");
......
__asm__ __volatile__("POP R1\t");
__asm__ __volatile__("POP R0\t");
通常大家都会认为,在任务调度开始时,当然要将所有的通用寄存器都保存,并且还应该
保存程序状态寄存器 SREG。然后再根据相反的次序,将新任务的寄存器的内容恢复。
但是,事实真的是这样吗?如果大家看过陈明计先生写的 small rots51,就会发现,它所保
存的通用寄存器不过是 4 组通用寄存器中的 1 组。
在 Win AVR 中 的 帮 助 文 件 avr-libc Manual 中的 Related Pages 中的
Frequently Asked Questions,其实有一个问题是"What registers are used by the C compiler?" 回
答了编译器所需要占用的寄存器。一般情况下,编译器会先用到以下寄存器
1 Call-used registers (r18-r27, r30-r31): 调用函数时作为参数传递,也就是用得最多的寄存
器。
2 Call-saved registers (r2-r17, r28-r29): 调用函数时作为结果传递,当中的 r28 和 r29 可能会被
作为指向堆栈上的变量的指针。
3 Fixed registers (r0, r1): 固定作用。r0 用于存放临时数据,r1 用于存放 0。
还有另一个问题是"How to permanently bind a variable to a register?",是将变量绑定到通
用寄存器的方法。而且我发现,如果将某个寄存器定义为变量,编译器就会不将该寄存器分
配作其它用途。这对 RTOS 是很重要的。
在"Inline Asm"中的"C Names Used in Assembler Code"明确表示,如果将太多的通用寄存器
定义为变量,刚在编译的过程中,被定义的变量依然可能被编译器占用。
大家可以比较以下两个例子,看看编译器产生的代码:(在*.lst 文件中)
第一个例子:没有定义通用寄存器为变量
www.ourdev.cn
#include <avr/io.h>
unsigned char add(unsigned char b,unsigned char c,unsigned char d)
{
return b+c*d;
}
int main(void)
{
unsigned char a=0;
while(1)
{
a++;
PORTB=add(a,a,a);
}
}
在本例中,"add(a,a,a);"被编译如下:
mov r20,r28
mov r22,r28
mov r24,r28
rcall add
第二个例子:定义通用寄存器为变量
#include <avr/io.h>
unsigned char add(unsigned char b,unsigned char c,unsigned char d)
{
return b+c*d;
}
register unsigned char a asm("r20"); //将 r20 定义为 变量 a
int main(void)
{
while(1)
{
a++;
PORTB=add(a,a,a);
剩余47页未读,继续阅读
lkang1029
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功