AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
13.08.2014, 22:41
|
|
Временная регистрация
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
WinAVR и malloc()
В общет такая бяка приключается. В файле пытаюсь выделить память с помощью malloc()
Код:
|
void main {
.......
UDR = ('4');
do{
//ïðîâåðêà, ÷òî UART ÷òîòî ïðèíÿë
if _UARTRECEIVED {
unsigned char c = UDR;
//Åñëè ýòî ñèìâîë ?, òî çíà÷èò âïåðåäè çàãðóçêà
if (c == '?')
bootLoader();
}
}while (1);
}
void bootLoader() {
....
uint8_t *buf;
unsigned char cmd;
unsigned char nl,nh;
uint8_t idx = 0;
_UARTSEND('a');
// buf = (uint8_t *)malloc(SPM_PAGESIZE);
buf = (uint8_t *)malloc(16);
_UARTSEND('b');
....
} |
если комментирую код с malloc(), то все нормально пробегает, выкидывает на терминал a и b. Если же код оставить с вызовом, то просто проходит ресет контроллера.
Немогу понять почему.
WinAVR 20100110. У когото такие грабли попадались? Если да, то как кто лечит?
__________________
|
|
|
|
14.08.2014, 00:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: WinAVR и malloc()
Странно. По пробуйте убрать (uint8_t *) перед malloc. Или по пробуйте заменить на calloc().
|
|
|
|
14.08.2014, 00:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: WinAVR и malloc()
Да кстати - бутлоадер в секции бутлоадера? Вполне возможно не определён стек или начало и конец кучи. Что в листинге и мап файле?
|
|
|
|
14.08.2014, 07:37
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: WinAVR и malloc()
Сообщение от svd71
|
Немогу понять почему.
WinAVR 20100110. У когото такие грабли попадались? Если да, то как кто лечит?
|
Вообще-то, обычно принято проверять результат выполнения данной функции:
Код:
|
ptr = (char *)malloc(16);
if (ptr == NULL)
{
error("No memory allocated");
exit (ERROR);
} |
malloc исрользуется для выделения динамической памяти из области heap. Если размер heap невелик, то запрашиваемая память не может быть выделена. Иногда можно вернуть выделенную память в "кучу" (если ранее сделанные запросы были успешными) с помощью функции free().
|
|
|
|
14.08.2014, 12:35
|
|
Временная регистрация
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: WinAVR и malloc()
Спасибо, други, что ответили.
Это не бутлоадер в секции бутлоадера. Это отдельный бутлоадер, получающий управление из основного тела программы (пока еще не придумал физического признака загрузки лодадера от требований конечной железки). Из-за этого за ночь посетили мысли, но об этом чуть позже.
Порылся еще на форумах. Народ тоже жалуется, что в WinAVr 20100110 эта функция неправильно отрабатывает. Другие жалуются, что у avr-gcc 1.6.х такая же беда и даже проблема в Ардурине всплывает. Но у avr-gcc последняя версия 1.8.х, а в WinAVR больше не обновляется, попробовал обновить библиотеки из накопал функцию aalloc(). С ней прокатило.
Проверка результата ничего не дает - код ресетится при запрыгивании в bootLoader(). Нет в терминале метки "а", что там проверять?
теперь по поводу дальнейшего кода. функция bootLoader загружается в самый верх флэша, а не секцию бутлоадера. Это означает, что при обновлении можно только контролировать, что бы код компилированной программы был не длиннее последней страницы флэша. Из-за этого нет нужды активировать аппаратный бутлоадер и избежать секций nrww. Хотя соглашусь, такие извраты из-за недостатка опыта работы с бутом. Позже может что и лучше выйдет.
Теперь терзают смутные сомнения, не лоханулся ли я с alloc? По логике вещей эта функция располагается там, где компилятор положит и в сегмент bootLoader не знаю как запихнуть. Хотя, следуя логики, размещение функции происходит один раз в самом начале процедуры. Но сейчас нет реального кода окромя бутлоадера и непонятки будут как будет вести себя куча, со всеми переменными программы и потом попытки выделить еще памяти по alloc.
Так как возвращение из bootLoader производится через симуляцию ресета, то и при заходе в процеедуру будет логично провести инициализацию всего. А вместо вызова alloc заставить хип или стек подвинуться и маппировать буффер непосрественно в память.
Поэтому если кто-то делал подобные фокусы, поделитесь опытом.
__________________
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:53.
|
|