在PSoC中,可以在内存空间mapped to flash中声明变量。由于闪存读取速度比RAM读取速度慢,程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存。除了修改闪光灯的值时。这可以是即时的done,程序员知道发生的精确时刻。这也是相对较少的事情(为了防止写入磨损引起的闪光)并且花费相对较长的时间。如果是这样的写,如果变量是从底层内存中恢复它的值(像volatile一样),然后按照通常的方式进行,所有优化直到下一次写入。我可以暂时变化一个变量吗?
所以,实质上,一些强制使用其基础存储器单元刷新变量的机制将是有用的;无论是在写入后不久(限制写入后)还是某段代码(在写入操作后跳转到“刷新”功能)。在C中一般都有这样的机制,还是在GCC中有这种机制? (另外,考虑到内存限制(2-4KB RAM),如果将RAM /寄存器分配给优化器 - 将每个变量镜像到两个持久版本的简单方法:volatile(在Flash中)和非易失性(在RAM中),在刷新期间将易失性重写为非易失性,然后使用非易失性从此开始将是相当浪费的。)
我想知道如果我明确地重写它,它是否会更新非易失性'foo':'foo = *(volatile int *)& foo;' – 2014-09-03 05:45:44
@SF。是的,这应该可以工作,但它会以其他方式:'*(volatile int *)&foo = foo;',因为您需要保证写入而不是读取。剩下的一个问题是,即使没有“易失性”,更新可能仍然频繁,以至于无法使用闪存单元。 – Potatoswatter 2014-09-03 06:33:56
不是真的;要写入闪存,你需要跳过一些箍环(用一些专用函数重写底层闪存);通常你将它们创建为'volatile const'。只是为了让它们变成非const的,但是在flash中你需要应用一些'__attribute()__'魔法。如果您只是写入变量,写入不会真正发生,它只是更新其缓存值,以及底层闪存发生的情况。 – 2014-09-03 06:55:29