STM32: неинициализированные переменные? - PullRequest
1 голос
/ 02 декабря 2011

используя IDE uvision для разработки STM32, я хочу, чтобы некоторые переменные таймера не инициализировались при запуске. Я пробовал:

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

и

__attribute__((zero_init)) volatile int system_timer;

но, похоже, ничего не работает. Следуя подсказкам от elswhere, я дополнительно проверил NoInit в options / target / IRAM1. Тем не менее, после сброса переменные устанавливаются в ноль.

Кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 14 марта 2014

Вам необходимо выполнить следующие шаги. объявите вашу переменную следующим образом:

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

Затем вам нужно использовать scatter-файл, чтобы объявить секцию исполнения с атрибутом 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)
   }
}
3 голосов
/ 24 июля 2012

Вы должны проверить адрес этой переменной из файла .MAP и использовать ключевое слово at

позволяет вам указать адрес для неинициализированных переменных в ваших исходных файлах C.

В следующем примере показано, как найти несколько различных типов переменных, используя ключевое слово в . Например ......

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';
}

Надеюсь, это поможет решить вашу проблему.

...