STM32:非初始化变量?

时间:2011-12-02 19:58:20

标签: variables initialization stm32 keil

使用uvision IDE进行STM32开发,我希望在启动时没有初始化一些定时器变量。我试过了:

volatile unsigned int system_time __attribute__((section(".noinit")));

__attribute__((zero_init)) volatile int system_timer;

但似乎没有任何效果。根据elswhere的提示,我还在选项/目标/ IRAM1上检查了NoInit。 仍然,复位后变量设置为零。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您必须从.MAP文件中检查该变量的地址,并使用 at 关键字

允许您在C源文件中指定未初始化变量的地址。

以下示例演示了如何使用 at 关键字查找多个不同的变量类型。例如......

struct link  {
  struct link idata *next;
  char        code  *test;
};

struct link idata list _at_ 0x40;     /* list at idata 0x40 */
char xdata text[256]   _at_ 0xE000;   /* array at xdata 0xE000 */
int xdata i1           _at_ 0x8000;   /* int at xdata 0x8000 */
char far ftext[256]    _at_ 0x02E000; /* array at xdata 0x03E000 */

void main ( void ) {
  link.next = (void *) 0;
  i1        = 0x1234;
  text [0]  = 'a';
  ftext[0]  = 'f';
}

我希望它有助于解决您的问题。

答案 1 :(得分:3)

您需要按照以下步骤操作。 声明您的变量如下:

volatile unsigned int system_time __attribute__((section(".noinit"),zero_init));

然后,您必须使用分散文件来声明具有NOINIT属性的执行部分,并将其与链接器一起使用。 示例分散文件:

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
   ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
      *.o (RESET, +First)
      *(InRoot$$Sections)
      .ANY (+RO)
   }
   RW_IRAM1 0x20000000 UNINIT 0x00000100  { ;no init section
      *(.noinit)
   }
   RW_IRAM2 0x20000100 0x0000FFF0  {                ;all other rw data
      .ANY(+RW +ZI)
   }
}