历史上的今天
今天是:2025年02月16日(星期日)
2020年02月16日 | 建立一个属于自己的AVR的RTOS(第三篇:GCC)
2020-02-16 来源:eefocus
简介:本文为建立一个属于自己的AVR的RTOS:第三篇:GCC中对寄存器的分配与使用相关内容。
第三篇:GCC中对寄存器的分配与使用
在很多用于AVR的RTOS中,都会有任务调度时,插入以下的语句:
入栈:
__asm____volatile__("PUSHR0
t");
__asm____volatile__("PUSHR1
t");
......
__asm____volatile__("PUSHR31
t");
出栈
__asm____volatile__("POPR31
t");
......
__asm____volatile__("POPR1
t");
__asm____volatile__("POPR0
t");
通常大家都会认为,在任务调度开始时,当然要将所有的通用寄存器都保存,并且还应该保存程序状态寄存器SREG。然后再根据相反的次序,将新任务的寄存器的内容恢复。
但是,事实真的是这样吗?如果大家看过陈明计先生写的smallrots51,就会发现,它所保存的通用寄存器不过是4组通用寄存器中的1组。
在WinAVR中的帮助文件avr-libcManual中的RelatedPages中的FrequentlyAskedQuestions,其实有一个问题是"WhatregistersareusedbytheCcompiler?"回答了编译器所需要占用的寄存器。一般情况下,编译器会先用到以下寄存器
1Call-usedregisters(r18-r27,r30-r31):调用函数时作为参数传递,也就是用得最多的寄存器。
2Call-savedregisters(r2-r17,r28-r29):调用函数时作为结果传递,当中的r28和r29可能会被作为指向堆栈上的变量的指针。
3Fixedregisters(r0,r1):固定作用。r0用于存放临时数据,r1用于存放0。
还有另一个问题是"Howtopermanentlybindavariabletoaregister?",是将变量绑定到通用寄存器的方法。而且我发现,如果将某个寄存器定义为变量,编译器就会不将该寄存器分配作其它用途。这对RTOS是很重要的。
在"InlineAsm"中的"CNamesUsedinAssemblerCode"明确表示,如果将太多的通用寄存器定义为变量,刚在编译的过程中,被定义的变量依然可能被编译器占用。
大家可以比较以下两个例子,看看编译器产生的代码:(在*.lst文件中)
第一个例子:没有定义通用寄存器为变量
#include unsignedcharadd(unsignedcharb,unsignedcharc,unsignedchard) { returnb+c*d; } intmain(void) { unsignedchara=0; while(1) { a++; PORTB=add(a,a,a); } } 在本例中,"add(a,a,a);"被编译如下: movr20,r28 movr22,r28 movr24,r28 rcalladd 第二个例子:定义通用寄存器为变量 #include unsignedcharadd(unsignedcharb,unsignedcharc,unsignedchard) { returnb+c*d; } registerunsignedcharaasm("r20");//将r20定义为变量a intmain(void) { while(1) { a++; PORTB=add(a,a,a); } } 在本例中,"add(a,a,a);"被编译如下: movr22,r20 movr24,r20 rcalladd 当然,在上面两个例子中,有部份代码被编译器优化了。 通过反复测试,发现编译器一般使用如下寄存器: 第1类寄存器,第2类寄存器的r28,r29,第3类寄存器 如在中断函数中有调用基它函数,刚会在进入中断后,固定地将第1类寄存器和第3类寄存器入栈,在退出中断又将它们出栈。
上一篇:如何给AVR16芯片解锁
下一篇:AVR Stduio安装与使用
史海拾趣
|
一、安检门原理由晶振产生3.5-4.95M的正弦振荡,由分频器分频为7.8K左右正弦波,经三极管与线圈进行功率放大后输入门板(7区)大线圈进行电磁波发射,由门内1-6区线圈分别进行接收。接收后,将接收到的信号与基准信号进行了比较,发现变化后,改变采 ...… 查看全部问答> |
|
索尼试制了不用电源线即可驱动电视机等电子产品的“无线供电系统”。这种技术通过磁场共振传输电力,可向距离50cm~80cm的电子产品传输60W的电力。供受电设备间的送电效率为80%,加上电源整流电路等,系统整体效率维持在了60%。笔者日前采访了参 ...… 查看全部问答> |
|
用LED共阴极方式写运行无错误 unsigned char code BitTab[]={0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char code DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; 把里面的数改为共阳极的数,就有*** error 65: access ...… 查看全部问答> |
|
100件未来式设计方案,是否反映出想象力和现实的矛盾呢?作出你自己的判断吧http://www.webdesignerdepot.com/2009/04/100-amazing-futuristic-design-concepts-w-wish-were-real/… 查看全部问答> |
|
TI研讨会中奖“TMDX5515EZDSP 开发板和工具包 ” C5515 DSP的主要特性与优势: 3 个片上 LDO 分别用于 DSP 内核、USB 以及模拟子系统; SDRAM 与移动 SDRAM 可支持低功耗应用; 包括高速 USB 2.0、I2S、UART、SP ...… 查看全部问答> |
|
求用最小系板和DS18B20来测量温度并在12864液晶上显示 各位玩MSP430的大大们,求助啦~! 想用MSP430最小系统版和DS18B20来测量温度,且在12864LCD液晶上面显现出数据来! 可不可以帮忙写下代码啊! 急用啊! 下面的CX-1A系统版的原理图 小弟感激不尽! [ 本帖最后由 z9 ...… 查看全部问答> |
|
处理一批2.4寸TFT屏,每人限购10PCS,有美女,有送! 2.4寸TFT屏,带触摸屏,ILI9320驱动!引脚定义如下图: 前天 12:21 上传下载附件 (146.79 KB) 屏的图片如下: 前天 12:21 上传下载附件 (73.57 KB) 前天 12:21 上传下载附件 (63.51 KB) 显示效果如下: ...… 查看全部问答> |
|
【视频分享】TMS320C64x+网络课程9 - sRIO(串行RapidIO) 简介:TMS320C64x+网络课程9——sRIO(串行RapidIO),主要介绍sRIO的一些基本信息,如支持特性,memory管理,中断支持,在DSP内部进行传输,BIOS中的支持等。此网络培训针对C64x+,每次一个专题,由DSP高性能部门技术支持工程师为您全程指导,敬请 ...… 查看全部问答> |




