现在的位置: 首页 > 综合 > 正文

ATmega128的SRAM结构和编程注意事项

2014年02月15日 ⁄ 综合 ⁄ 共 1931字 ⁄ 字号 评论关闭

  泉注:某些注意事项在特定条件下还是要违反的,为了程序方便。

 

1、 SRAM的结构
工作寄存器区包括32个8位寄存器。编译器使用了R0、R1、R22~R31。R2~R15中的一些寄存器可能会用来存放全局位变量;剩下的寄存器会分配给全局字符串变量和全局整形变量。R16~R21分配给局部字符型变量和局部整形变量。
I/O寄存器区包括64个CPU外围功能地址。
数据对战区用于动态存储变量、传递函数参数,以及中断期间保存R0、R1、R22~R31和SREG的内容。
数据堆栈区指针使用Y指针寄存器。数据堆栈指针的初始值为5Fh+数据对战长度。在数据堆栈保存数据时,数据堆栈指针是递减的。在配置编译选项时,必须分配足够的堆栈空间。
0
           工作寄存器                                         
20h
           I/O寄存器
60h
           栈底数据堆栈
 
60h+数据堆栈长度
           全局变量
 
60h+数据堆栈长度+全局变量长度       
栈底硬件堆栈                   //存放寒暑返回地址,SP寄存器是堆栈指针,初始值为//SRAM的尾部地址.
 
SRAM尾部
2、 在程序中嵌入汇编语言
asm volatile("mov __tmp_reg__, %A0" "/n/t"
             "mov %A0, %B0"         "/n/t"
             "mov %B0, __tmp_reg__" "/n/t"
             : "=r" (value)
              : "0" (value)
            );
R0、R1、R22~R31可以在汇编子程序中自由使用。如果在中断过程中使用这些寄存器,那么就必须在进入时保存、返回时恢复。
3、 代码编写需要禁止的注意事项
1) 如果要嵌入汇编语言,则必须将所有汇编语言包装在C语言函数里,而且这些函数中只有汇编语句,没有常规的C语言语句。
2) 不得使用三元操作符(?:)。
3) 不得残留被注释过的废代码。
4) 所有的标识符不得超过31个字符。
5) 不同名空间的变量名不得相同。
6) 必须显示生命为unsigned char或者singed char。
7) 禁止使用八进制数,因为086U这样的常数很容易引起误解。
8) 不得定义与外部作用域中某个标识符同名的对象,以避免遮盖外部变量作用域中的标识符。
9) 具有作用域的标识符应尽量声明为static型。
10) 在同一个编译单元中,同一个标识符不应该同时具有内部连接和外部链接。解决的方法是:定义g_count的文件时,尽量不要包含声明g_count的头文件。
11) 具有外部连接性质的标识符应该只声明一次。
12) 外部对象不得在多个文件中声明。
13) 自动对象(栈对象)使用前,必须赋值。
14) 操作符&&he ||的右侧表达式不得具有副作用。
15) 在返回布尔值的表达式中,不得出现赋值操作。即if(x== fopen(“fname”, ”r”));被禁止。直接就可以判断了啊。
16) 不得对有符号数直接是假位操作,例如禁止1<<4。
17) 不得对有符号数表达式十家”-”操作符。
18) 不得对有副作用的表达式时就爱sizeof操作符。
19) 除了循环控制语句,不得使用逗号表达式。
20) 禁止冗余的显示转型。
21) 禁止从任意类型到指针的强制转换,禁止从指针到任意类型的强制转换。例如void *p = (void *)0xFFFF8888UL。@实际上很多时候是需要这样的转换的。
22) 显式测试值是否为0。
23) 不得显式判断浮点数的相等性和不等性。
24) 不得一流“永远不会用到”的代码。
25) 素有的非空语句必须具有副作用。@编译角度?
26) 除了switch语句,不得使用标号label。
27) 不得使用goto。
28) 不得使用continue。
29) 除了switch语句,不得使用break。
30) If,else if等必须用{}封装。
31) 任何if,else if语句,最后必须有一个收尾的else。
32) 循环计数器的值不得在循环体内修改。
33) 禁止任何直接和间接的递归函数调用。
34) 每个函数只能有一个退出点。
35) 如果一个函数可能返回错误信息,那么调用后必须加以测试。
36) 不应该使用#undef。
37) 不得将宏作为参数传递给红函数。
38) 在一个宏定义中,##和#符号只能出现一次。
39) 禁止指针运算,代之以数组下标运算。
40) 禁止超过两级的指针。
41) 禁止使用指向函数的非常量指针。
42) 部的对栈对象的地址传给外部作用域的对象。

 

抱歉!评论已关闭.