реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> GCC STM32 static var
Dave Owen
сообщение May 9 2014, 21:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-04-09
Пользователь №: 47 556



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

Код
static int TestVar = 0;

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

    //TestVar ++;

    while(1)
    {
    }
}


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


Полностью проект получился такой
Прикрепленные файлы
Прикрепленный файл  TestStatic.zip ( 166.91 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
adnega
сообщение May 10 2014, 06:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Попробуйте переменную использовать как volatile.
В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 10 2014, 08:59
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dave Owen
сообщение May 10 2014, 13:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-04-09
Пользователь №: 47 556



Цитата(adnega @ May 10 2014, 10:38) *
Попробуйте переменную использовать как volatile.
В данном проекте переменную вообще можно безболезненно соптимизировать) - т.е. выкинуть, и ничего не изменится.


Оптимизация отключена -O0;
Добавление volatile не помогло. Значение переменной отлично от defaul value.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 10 2014, 13:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Может у Вас 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();
}
Go to the top of the page
 
+Quote Post
Dave Owen
сообщение May 10 2014, 13:55
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-04-09
Пользователь №: 47 556



Цитата(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 закомментирован
Go to the top of the page
 
+Quote Post
Petka
сообщение May 12 2014, 04:50
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Dave Owen @ May 10 2014, 17:55) *
* @file startup_coide.c
.......
код обнуления bss закомментирован

bb-offtopic.gif Выглядит как палёный "abibas".
Понятно, что это сокращение от названия среды, но вот ассоциации...
Go to the top of the page
 
+Quote Post
klen
сообщение May 12 2014, 05:10
Сообщение #8


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



добавлю свои пять копеек.
на будующее если вылезет.
если вдруг захотите использовать С++, то в таком виде CRT как у Вас еще и конструкторы статических объектов не будут вызываться. решение - добавить в CRT код вызов __libc_init_array() если libc хоть както стандарту соответствует. так же эта мера обеспечит вызов С функций с атрибутом конструктора (это к С++ никак не отностися).
Go to the top of the page
 
+Quote Post
Dave Owen
сообщение May 12 2014, 07:52
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-04-09
Пользователь №: 47 556



Цитата(Petka @ May 12 2014, 08:50) *
bb-offtopic.gif Выглядит как палёный "abibas".
Понятно, что это сокращение от названия среды, но вот ассоциации...


видимо у ребят из CooCox CoIDE не работает shift biggrin.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016