在PSoC中,可以在内存空间mapped to flash中声明变量 . 由于闪存读取比RAM读取慢,因此程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存 . 除了修改闪光灯的值时 . 这可以是done,程序员知道发生的精确时刻 . 这也是相对较少的(为了保护闪存免受写入磨损)并且花费相对长的时间 . 在这种写入的情况下,如果变量从底层存储器恢复其值(表现得像易失性),然后像往常一样继续进行,直到下一次写入,这将是好的 .
因此,从本质上讲,一些通过使用底层存储单元强制刷新变量的机制将是有用的;是时间限制(写入后不久)还是某些代码段(写入操作后跳转到'刷新'功能) . C中是否有任何此类机制,特别是GCC?
(另外,考虑到内存限制(2-4KB RAM),最好将RAM /寄存器的分配留给优化器 - 让每个变量在两个持久化版本中镜像的简单方法:volatile(在Flash中)和非volatile(在RAM中),在刷新期间将volatile写入非易失性,然后从那时起使用非易失性将是相当浪费的 . )
2 回答
您应该通过在RAM中显式维护变量来自己进行缓存 . CPU经常没有可用的寄存器,编译器不会使用堆栈来缓存全局 .
您可以尝试声明变量非易失性,然后通过易失性指针(例如
* (volatile int *) & foo
)访问它 . 就个人而言,我会称之为灾难的秘诀 . 它可能不会更新foo
的"cached"值 .反过来并声明它
volatile
但是用指针删除限定条件会产生未定义的行为 . 无论如何,编译器可能不会将指针解引用提升到寄存器 .您可以尝试使用两个变量:
对于您的大多数程序使用
foo
,但是当发生写入时,将foo_vol
分配给foo
.这将导致
foo
获得优化,但它仍然可以使用新值 . 我不确定这种方法是否适用于您的特定设置,但无论如何都要好运 .