首页 文章

我可以暂时变量变量吗?

提问于
浏览
2

PSoC中,可以在内存空间mapped to flash中声明变量 . 由于闪存读取比RAM读取慢,因此程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存 . 除了修改闪光灯的值时 . 这可以是done,程序员知道发生的精确时刻 . 这也是相对较少的(为了保护闪存免受写入磨损)并且花费相对长的时间 . 在这种写入的情况下,如果变量从底层存储器恢复其值(表现得像易失性),然后像往常一样继续进行,直到下一次写入,这将是好的 .

因此,从本质上讲,一些通过使用底层存储单元强制刷新变量的机制将是有用的;是时间限制(写入后不久)还是某些代码段(写入操作后跳转到'刷新'功能) . C中是否有任何此类机制,特别是GCC?

(另外,考虑到内存限制(2-4KB RAM),最好将RAM /寄存器的分配留给优化器 - 让每个变量在两个持久化版本中镜像的简单方法:volatile(在Flash中)和非volatile(在RAM中),在刷新期间将volatile写入非易失性,然后从那时起使用非易失性将是相当浪费的 . )

2 回答

  • 2

    您应该通过在RAM中显式维护变量来自己进行缓存 . CPU经常没有可用的寄存器,编译器不会使用堆栈来缓存全局 .

    您可以尝试声明变量非易失性,然后通过易失性指针(例如 * (volatile int *) & foo )访问它 . 就个人而言,我会称之为灾难的秘诀 . 它可能不会更新 foo 的"cached"值 .

    反过来并声明它 volatile 但是用指针删除限定条件会产生未定义的行为 . 无论如何,编译器可能不会将指针解引用提升到寄存器 .

  • 0

    您可以尝试使用两个变量:

    int foo;
    volatile int foo_vol;
    

    对于您的大多数程序使用 foo ,但是当发生写入时,将 foo_vol 分配给 foo .

    if (there_was_a_write)
        foo = foo_vol;
    process_data(&foo, bar);
    

    这将导致 foo 获得优化,但它仍然可以使用新值 . 我不确定这种方法是否适用于您的特定设置,但无论如何都要好运 .

相关问题