dufaxing To be a better man

C语言问题摘要

2018-04-18


  • 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()经常有重入和性能上的问题,可能导致中断嵌套。



下一篇 Python列表

Comments

Content