Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC STM32 static var
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Dave Owen
Хочу перенести проект с Keil на CooIDE+GCC
почему-то не хотят инициализироваться переменные помеченные как static

Код
static int TestVar = 0;

int main(void)
{
     asm(" NOP");        <- точка останова

    //TestVar ++;

    while(1)
    {
    }
}


Значение переменной почти всегда мусор значения от 999 до 1М. Хотя жду что будет 0
Может кто сталкивался с такой проблемой?


Полностью проект получился такой
adnega
Попробуйте переменную использовать как volatile.
В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.
Сергей Борщ
Цитата(Dave Owen @ May 10 2014, 00:17) *
Полностью проект получился такой
Не могли бы вы в настройках проекта найти и включить генерацию листингов и .map-файла? Если галочек нет, но есть возможность вписывать ключи командной строки, то впишите в строку запуска линкера -Wl,-Map=<имя файла.map> и выложите сюда полученный файл.
Dave Owen
Цитата(adnega @ May 10 2014, 10:38) *
Попробуйте переменную использовать как volatile.
В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.


Оптимизация отключена -O0;
Добавление volatile не помогло. Значение переменной отлично от defaul value.
adnega
Может у Вас startup плохой или скрипт линкера.
Посмотрел startup - там какой-то враг все закементировал))
Код
void Default_Reset_Handler(void)
{
  /* Initialize data and bss */
  unsigned long *pulSrc, *pulDest;

  /* Copy the data segment initializers from flash to SRAM */
//  pulSrc = &_sidata;
//
//  for(pulDest = &_sdata; pulDest < &_edata; )
//  {
//    *(pulDest++) = *(pulSrc++);
//  }
//
//  /* Zero fill the bss segment. */
//  for(pulDest = &_sbss; pulDest < &_ebss; )
//  {
//    *(pulDest++) = 0;
//  }

  /* Setup the microcontroller system. */
  SystemInit();
    
  /* Call the application's entry point.*/
  main();
}
Dave Owen
Цитата(adnega @ May 10 2014, 17:40) *
Может у Вас startup плохой или скрипт линкера.
Посмотрел startup - там какой-то враг все закементировал))


Действительно дело было в bss
У ARM и IAR нет очиcтки bss как у GCC

Скачал свежий CMSIS с сайта STM них код
* @file startup_stm32l1xx_md.s
* @author MCD Application Team
* @version V1.1.1
* @date 09-March-2012

/* Zero fill the bss segment. */ есть
В старых версиях тоже присутствует

Почему-то с сайта Coocox.org
* @file startup_coide.c
* @author Coocox
* @version V1.0
* @date 20/07/2010
код обнуления bss закомментирован
Petka
Цитата(Dave Owen @ May 10 2014, 17:55) *
* @file startup_coide.c
.......
код обнуления bss закомментирован

bb-offtopic.gif Выглядит как палёный "abibas".
Понятно, что это сокращение от названия среды, но вот ассоциации...
klen
добавлю свои пять копеек.
на будующее если вылезет.
если вдруг захотите использовать С++, то в таком виде CRT как у Вас еще и конструкторы статических объектов не будут вызываться. решение - добавить в CRT код вызов __libc_init_array() если libc хоть както стандарту соответствует. так же эта мера обеспечит вызов С функций с атрибутом конструктора (это к С++ никак не отностися).
Dave Owen
Цитата(Petka @ May 12 2014, 08:50) *
bb-offtopic.gif Выглядит как палёный "abibas".
Понятно, что это сокращение от названия среды, но вот ассоциации...


видимо у ребят из CooCox CoIDE не работает shift biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.