- 1、位操作(Bit manipulation):嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量 a,写两段代码,第一个设置 a
的 bit 3,第二个清除 a 的 bit 3。在以上两个操作中,要保持其它位不变
#define BIT3 (0x1 << 3) static int a; void set_bit3(void) { a |= BIT3; } void clear_bit3(void) { a &= ~BIT3; }
- 2、访问固定的内存位置(Accessing fixed memory locations):嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为
0x67a9 的整型变量的值为 0xaa66。
int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa66;
A more obscure approach is:
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
- 3、对绝对地址 0x100000 赋值且想让程序跳转到绝对地址是 0x100000 去执行。
(unsigned int*)0x100000 = 1234; //首先要将 0x100000 强制转换成函数指针,即: (void (*)())0x100000 //然后再调用它: *((void (*)())0x100000)(); //用 typedef 可以看得更直观些: typedef void(*)() voidFuncPtr; *((voidFuncPtr)0x100000)();
- 4、中断(Interrupts):中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准 C 支持中断。具
代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt 关键字去定义了一
个中断服务子程序(ISR),请评论一下这段代码。
__interrupt double compute_area (double radius) { double area = PI * radius * radius; printf("\nArea = %f", area); return area; }
(1)ISR 不能返回一个值。
(2)ISR 不能传递参数。
(3)在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有 些处理器/编译器就是不允许在 ISR 中做浮点运算。此外, ISR 应该是短而有效率的,在 ISR 中做浮点运算 是不明智的。
(4)printf()经常有重入和性能上的问题,可能导致中断嵌套。