Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 13.08.2014, 22:41  
svd71
Временная регистрация
 
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
svd71 на пути к лучшему
По умолчанию 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. У когото такие грабли попадались? Если да, то как кто лечит?
Реклама:
__________________
svd71 вне форума  
Непрочитано 14.08.2014, 00:06  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: WinAVR и malloc()

Странно. По пробуйте убрать (uint8_t *) перед malloc. Или по пробуйте заменить на calloc().
_guardianangel вне форума  
Непрочитано 14.08.2014, 00:10  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: WinAVR и malloc()

Да кстати - бутлоадер в секции бутлоадера? Вполне возможно не определён стек или начало и конец кучи. Что в листинге и мап файле?
_guardianangel вне форума  
Непрочитано 14.08.2014, 07:37  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: WinAVR и malloc()

Сообщение от svd71 Посмотреть сообщение
Немогу понять почему.
WinAVR 20100110. У когото такие грабли попадались? Если да, то как кто лечит?
Вообще-то, обычно принято проверять результат выполнения данной функции:
Код:
      ptr = (char *)malloc(16);
      if (ptr == NULL)
           {
           error("No memory allocated");
           exit (ERROR);
           }
malloc исрользуется для выделения динамической памяти из области heap. Если размер heap невелик, то запрашиваемая память не может быть выделена. Иногда можно вернуть выделенную память в "кучу" (если ранее сделанные запросы были успешными) с помощью функции free().
Bill вне форума  
Непрочитано 14.08.2014, 12:35  
svd71
Временная регистрация
 
Регистрация: 17.09.2009
Сообщений: 68
Сказал спасибо: 13
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
svd71 на пути к лучшему
По умолчанию Re: WinAVR и malloc()

Спасибо, други, что ответили.

Это не бутлоадер в секции бутлоадера. Это отдельный бутлоадер, получающий управление из основного тела программы (пока еще не придумал физического признака загрузки лодадера от требований конечной железки). Из-за этого за ночь посетили мысли, но об этом чуть позже.

Порылся еще на форумах. Народ тоже жалуется, что в WinAVr 20100110 эта функция неправильно отрабатывает. Другие жалуются, что у avr-gcc 1.6.х такая же беда и даже проблема в Ардурине всплывает. Но у avr-gcc последняя версия 1.8.х, а в WinAVR больше не обновляется, попробовал обновить библиотеки из накопал функцию aalloc(). С ней прокатило.

Проверка результата ничего не дает - код ресетится при запрыгивании в bootLoader(). Нет в терминале метки "а", что там проверять?

теперь по поводу дальнейшего кода. функция bootLoader загружается в самый верх флэша, а не секцию бутлоадера. Это означает, что при обновлении можно только контролировать, что бы код компилированной программы был не длиннее последней страницы флэша. Из-за этого нет нужды активировать аппаратный бутлоадер и избежать секций nrww. Хотя соглашусь, такие извраты из-за недостатка опыта работы с бутом. Позже может что и лучше выйдет.

Теперь терзают смутные сомнения, не лоханулся ли я с alloc? По логике вещей эта функция располагается там, где компилятор положит и в сегмент bootLoader не знаю как запихнуть. Хотя, следуя логики, размещение функции происходит один раз в самом начале процедуры. Но сейчас нет реального кода окромя бутлоадера и непонятки будут как будет вести себя куча, со всеми переменными программы и потом попытки выделить еще памяти по alloc.

Так как возвращение из bootLoader производится через симуляцию ресета, то и при заходе в процеедуру будет логично провести инициализацию всего. А вместо вызова alloc заставить хип или стек подвинуться и маппировать буффер непосрественно в память.
Поэтому если кто-то делал подобные фокусы, поделитесь опытом.
__________________
svd71 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Глюки WinAVR KBH-I Коллекция глюков 19 07.06.2011 01:16
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01
WinAVR в вопросах и ответах avr123-nm-ru Микроконтроллеры, АЦП, память и т.д 0 02.03.2009 14:03
Задание массива во Flash AVR на Си в AVRStudio + WinAVR zelen536 Микроконтроллеры, АЦП, память и т.д 14 07.09.2007 10:45


Часовой пояс GMT +4, время: 14:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot