2014-09-02 116 views
2

PSoC中,可以在内存空间mapped to flash中声明变量。由于闪存读取速度比RAM读取速度慢,程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存。除了修改闪光灯的值时。这可以是即时的done,程序员知道发生的精确时刻。这也是相对较少的事情(为了防止写入磨损引起的闪光)并且花费相对较长的时间。如果是这样的写,如果变量是从底层内存中恢复它的值(像volatile一样),然后按照通常的方式进行,所有优化直到下一次写入。我可以暂时变化一个变量吗?

所以,实质上,一些强制使用其基础存储器单元刷新变量的机制将是有用的;无论是在写入后不久(限制写入后)还是某段代码(在写入操作后跳转到“刷新”功能)。在C中一般都有这样的机制,还是在GCC中有这种机制? (另外,考虑到内存限制(2-4KB RAM),如果将RAM /寄存器分配给优化器 - 将每个变量镜像到两个持久版本的简单方法:volatile(在Flash中)和非易失性(在RAM中),在刷新期间将易失性重写为非易失性,然后使用非易失性从此开始将是相当浪费的。)

回答

2

您应该通过在RAM中明确维护一个变量。 CPU通常不会有可用的寄存器,并且编译器不会使用堆栈来缓存全局。

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

做相反的事情,并声明它volatile但删除指针的限定,会产生未定义的行为。无论如何,编译器可能不会将指针解引用到寄存器。

+0

我想知道如果我明确地重写它,它是否会更新非易失性'foo':'foo = *(volatile int *)& foo;' – 2014-09-03 05:45:44

+0

@SF。是的,这应该可以工作,但它会以其他方式:'*(volatile int *)&foo = foo;',因为您需要保证写入而不是读取。剩下的一个问题是,即使没有“易失性”,更新可能仍然频繁,以至于无法使用闪存单元。 – Potatoswatter 2014-09-03 06:33:56

+0

不是真的;要写入闪存,你需要跳过一些箍环(用一些专用函数重写底层闪存);通常你将它们创建为'volatile const'。只是为了让它们变成非const的,但是在flash中你需要应用一些'__attribute()__'魔法。如果您只是写入变量,写入不会真正发生,它只是更新其缓存值,以及底层闪存发生的情况。 – 2014-09-03 06:55:29

0

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

int foo; 
volatile int foo_vol; 

使用foo对于大多数程序,但是当进行写操作时,分配给foo_volfoo

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

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

+0

正如在最后一段中详细说明的那样 - 是的,它会起作用,但它会浪费,像2KB RAM一样镜像变量。 – 2014-09-02 06:16:43

+0

看起来我误解了,对不起。 – McLovin 2014-09-03 01:40:23

相关问题