单片机编程细节日志

版权声明:请尊重原创成果,未经允许,禁止转载 https://blog.csdn.net/qq_31441951/article/details/86647681
  • _align(n):指示编译器在n 字节边界上对齐变量。
      对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。
例如:
	_align(8) char buffer[128];  // buffer starts on eight-byte boundary

详细参考:https://www.cnblogs.com/xidongs/p/5655440.html

  • __asm:此关键字用于将信息从编译器传递到 ARM 汇编器armasm
e.g:
1. __asm void my_strcpy(const char *src, char *dst);//使用 __asm 关键字声明或定义嵌入式汇编函数
2. register int foo __asm("r0");   //使用 __asm 关键字声明已命名的寄存器变量
3. 用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序:
	void delay(void)
	{
		#pragma asm
		MOV R4,#08H
		DJNZ R4,$
		#pragma endasm
	}


  • _packed:将所有有效类型的对齐边界设置为 1。
       使用 __packed 限定符声明结构或联合后,__packed 将应用于该结构或联合的所有成员。成员之间或结构末尾均没有填充。必须使用__packed 声明压缩结构的所有子结构。可以单独压缩非压缩结构的整型子字段。若要将结构映射到外部数据结构或访问未对齐数据,__packed 限定符非常有用;但由于访问开销相对较高,通常对节省数据大小并没有什么帮助。通过仅对需要压缩的结构中的字段进行压缩,可以减少未对齐访问的数量。
1.压缩结构
    typedef __packed struct
    {
        char x;                   // 结构体所有成员都会被__packed限定    
        int y;
    } X;


  • attribute((at(address))):指定变量的绝对地址
    链接器并非始终能够放置 at 变量属性生成的节。如果无法将节放置在指定地址,链接器将显示一条错误消息。
	int x1 __attribute__((at(0x10000))) = 10;
  • 冷启动和热启动
      冷启动,也就是一般所说的上电复位,冷启动后片内外RAM的内容是随机的;单片机的热启动是通过外部电路给运行中的单片机的复位端一复位电平而实现的,也就是所说的按键复位或看门狗复位。复位后,RAM的内容都没有改变。

猜你喜欢

转载自blog.csdn.net/qq_31441951/article/details/86647681