Jump to content

    
Sign in to follow this  
Dave Owen

GCC STM32 static var

Recommended Posts

Хочу перенести проект с Keil на CooIDE+GCC

почему-то не хотят инициализироваться переменные помеченные как static

 

static int TestVar = 0;

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

    //TestVar ++;

    while(1)
    {
    }
}

 

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

Может кто сталкивался с такой проблемой?

 

 

Полностью проект получился такой

TestStatic.zip

Share this post


Link to post
Share on other sites

Попробуйте переменную использовать как volatile.

В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.

Share this post


Link to post
Share on other sites
Полностью проект получился такой
Не могли бы вы в настройках проекта найти и включить генерацию листингов и .map-файла? Если галочек нет, но есть возможность вписывать ключи командной строки, то впишите в строку запуска линкера -Wl,-Map=<имя файла.map> и выложите сюда полученный файл.

Share this post


Link to post
Share on other sites
Попробуйте переменную использовать как volatile.

В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.

 

Оптимизация отключена -O0;

Добавление volatile не помогло. Значение переменной отлично от defaul value.

 

Share this post


Link to post
Share on other sites

Может у Вас 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();
}

Share this post


Link to post
Share on other sites
Может у Вас 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 закомментирован

 

Share this post


Link to post
Share on other sites
* @file startup_coide.c

.......

код обнуления bss закомментирован

:bb-offtopic: Выглядит как палёный "abibas".

Понятно, что это сокращение от названия среды, но вот ассоциации...

Share this post


Link to post
Share on other sites

добавлю свои пять копеек.

на будующее если вылезет.

если вдруг захотите использовать С++, то в таком виде CRT как у Вас еще и конструкторы статических объектов не будут вызываться. решение - добавить в CRT код вызов __libc_init_array() если libc хоть както стандарту соответствует. так же эта мера обеспечит вызов С функций с атрибутом конструктора (это к С++ никак не отностися).

Share this post


Link to post
Share on other sites
:bb-offtopic: Выглядит как палёный "abibas".

Понятно, что это сокращение от названия среды, но вот ассоциации...

 

видимо у ребят из CooCox CoIDE не работает shift :biggrin:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this