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

 
 
> bss и avr-gcc, забивается ли bss нулями
xelax
сообщение Feb 6 2008, 08:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



После написания программ на arm с помощью gcc, было очень необычно для avr-gcc отсутствие явного загрузочного кода и явного lowlevelinit. Я так понимаю когда указываешь таргет mmcu, линкер сам знает какой прикомпилированный код прилинковать.
А реализованно ли в этом коде забивание нулями bss секции. И где эти исходники посмотреть можно?

И всегда ли при объявлении глобального массива элементов любого типа например он будет заполнен нулями?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 6 2008, 10:56
Сообщение #2


Гуру
******

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



Цитата(xelax @ Feb 6 2008, 10:14) *
После написания программ на arm с помощью gcc, было очень необычно для avr-gcc отсутствие явного загрузочного кода и явного lowlevelinit.
Ну, почитать описание на avr-libc надо было.
Код
void low_level_init() __attribute__((__naked__)) __attribute__((section(".init3")));
void low_level_init()
{
}
. Загрузочный код да, автоматом, если не укажете свой.
Цитата(xelax @ Feb 6 2008, 10:14) *
А реализованно ли в этом коде забивание нулями bss секции. И где эти исходники посмотреть можно?
Искать исходники avr-libc. Включить генерацию листинга и убедиться.
Цитата(xelax @ Feb 6 2008, 10:14) *
И всегда ли при объявлении глобального массива элементов любого типа например он будет заполнен нулями?
Если компилятор соответствует стандарту С - то да.


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Feb 7 2008, 08:47
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Сергей Борщ @ Feb 6 2008, 12:56) *
Ну, почитать описание на avr-libc надо было.
Код
void low_level_init() __attribute__((__naked__)) __attribute__((section(".init3")));
void low_level_init()
{
}
А ещё лучше так:
Код
/*--  INIT_CODE(number)  --------------------------------------------------
*  Макрос для занесення коду в секції .init#number
*
*  Наприклад:
*  INIT_CODE(1)
*  {
*    MCUCR = (1 << SRE);
*    XMCRA = (4 << SRL0) | (0 << SRW00);
*    XMCRB = (1 << XMBK);
*  }
*
*  розподіл секцій для avr-gcc:
*  .init0  Start here after reset.
*  .init1
*  .init2  Clear __zero_reg__, set up stack pointer.
*  .init3
*  .init4  Initialize data and BSS.
*  .init5
*  .init6  C++ constructors.
*  .init7
*  .init8
*  .init9  Call main().
*
*/


#define INIT_CODE_N(_number_,_name_)\
    static void init##_name_ (void) __attribute__ ((section(".init" #_number_), naked, used));\
    static void init##_name_ (void)

#define _INIT_CODE(n,l) INIT_CODE_N(n,l)
#define INIT_CODE(_number_) _INIT_CODE(_number_,__LINE__)

xelax, avr-gcc позволяет иметь сколько угодно этих "low level init" - хоть по нескольку штук на файл (удобно - достаточно просто прилинковать модуль UART и он сам проинициализирует всё, что ему нужно), причём в разные места относительно работы запускалки - секции .init1, .init3, .init5, .init7, .init8 отданы пользователю. "функции" в секциях .init* не вызываются! они линкуются друг за дружкой без call/ret.
У меня довольно популярна секция .init5 - уже стек и все переменные проинициализированы, но конструкторы ещё не начали работать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 08:50
Рейтинг@Mail.ru


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