Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Атрибут naked при объявлении задачи
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Terminator
В доке к FreeRTOS написано что можно съекономить немного памяти стека объявив задачи с атрибутом naked, типа всё равно задача никогда не выходит, а сохранение контекста выполняет FreeRTOS.
Попробовал, сразу всё повисло. "Дохнет" на создании второй задачи внутри первой, вываливается в data abort.

sam7x512
"Среда"
arm-elf-gcc (GCC) 4.1.2 (Gentoo 4.1.2)
GNU ld version 2.17
newlib-1.15.0

Всё скомпилено в ARM. Без атрибута naked, работает.
Кто сталкивался? Подскажите где искать ошибку?
Николай Z
Цитата(Terminator @ Oct 8 2007, 06:33) *
В доке к FreeRTOS написано что можно съекономить немного памяти стека объявив задачи с атрибутом naked, типа всё равно задача никогда не выходит, а сохранение контекста выполняет FreeRTOS.
Попробовал, сразу всё повисло. "Дохнет" на создании второй задачи внутри первой, вываливается в data abort.

sam7x512
"Среда"
arm-elf-gcc (GCC) 4.1.2 (Gentoo 4.1.2)
GNU ld version 2.17
newlib-1.15.0

Всё скомпилено в ARM. Без атрибута naked, работает.
Кто сталкивался? Подскажите где искать ошибку?


Ошибка в том, что задача не должна создаваться изнутри другой задачи...
Для этого есть майн-функция из которой задачи создаются и запускаются...
Еще задачи могут создаваться, запускаться и уничтожаться из "диспетчера" задач, который собственно переключает контексты задач...
Terminator
Цитата(Николай Z @ Oct 8 2007, 13:37) *
Ошибка в том, что задача не должна создаваться изнутри другой задачи...
Для этого есть майн-функция из которой задачи создаются и запускаются...
Еще задачи могут создаваться, запускаться и уничтожаться из "диспетчера" задач, который собственно переключает контексты задач...

Что-то не нашёл в доке про FreeRTOS ограничений по созданию задач.
Если объявить без атрибута naked то всё работает, в том числе и создание новых задач из других задач.

Попробую создать все задачи в main-е ...

Ещё вопрос назрел.
В демке FreeRTOS есть 3 модели распределения памяти. Последняя с использованием библиотечных malloc, free.
Вот оно почему-то не работает. При запуске создаётся две задачи, приложение и idle. Так вот приложение никогда не получает управление. Смотрел пошаговое выполнение, все выделения памяти выполняются вроде правильно.
Куда копать?
Terminator
Перенос создания всех задач в main, помог.
Теперь объявил все задачи, включая саму main, naked и ничего не упало.
Почему заработало я так и не понял sad.gif

Вопрос про память всё ещё актуален
Сергей Борщ
Цитата(Terminator @ Oct 9 2007, 05:20) *
Если объявить без атрибута naked то всё работает, в том числе и создание новых задач из других задач.
В WinAVR нарвался на такое поведение - если объявить функцию naked, то компилятор выкидывает не только пролог, но и резервирование на стеке места для локальных переменных. В результате локальные переменные попадали в несуществующую память. Объявление функции с атрибутом noreturn существенно сократило пролог и оставило резервирование стека. Проверьте, возможно здесь подобная ситуация. Попробуйте заменить naked на noreturn.
Николай Z
Цитата(Terminator @ Oct 9 2007, 06:20) *
Что-то не нашёл в доке про FreeRTOS ограничений по созданию задач.
Если объявить без атрибута naked то всё работает, в том числе и создание новых задач из других задач.

Попробую создать все задачи в main-е ...

Ещё вопрос назрел.
В демке FreeRTOS есть 3 модели распределения памяти. Последняя с использованием библиотечных malloc, free.
Вот оно почему-то не работает. При запуске создаётся две задачи, приложение и idle. Так вот приложение никогда не получает управление. Смотрел пошаговое выполнение, все выделения памяти выполняются вроде правильно.
Куда копать?


В данном случае ход мысли должен быть иным - нет в описании прямого разрешения, значит это нельзя... Насколько я понимаю этот артибут - naked - лишает задачу обычного для функции пролога-эпилога и не позволяет ей отложить место на стеке - это раз... Во вторых запуск задачи из другой задачи - мне кажется приведет к пролемам со стеком либо запускающей либо запущенной задачи...
По-любому запуск задачи - это совершенно иной процесс, чем вложенный вызов другой функции и тут надо быть осторожным...

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

В описании RTOS нет прямого разрешение на исползование подзадач из задачи и все примеры сделаны так, что задачи запускаются именно из майн-функции или диспетчером задач - следовательно правильная работа в вашем варианте - никем не гарантируется...
Terminator
Цитата(Сергей Борщ @ Oct 9 2007, 17:04) *
В WinAVR нарвался на такое поведение - если объявить функцию naked, то компилятор выкидывает не только пролог, но и резервирование на стеке места для локальных переменных. В результате локальные переменные попадали в несуществующую память. Объявление функции с атрибутом noreturn существенно сократило пролог и оставило резервирование стека. Проверьте, возможно здесь подобная ситуация. Попробуйте заменить naked на noreturn.

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


Цитата(Николай Z @ Oct 10 2007, 02:20) *
В данном случае ход мысли должен быть иным - нет в описании прямого разрешения, значит это нельзя...

Также нет прямого описания где эти задачи можно создавать (может пропустил?).
Цитата
Насколько я понимаю этот артибут - naked - лишает задачу обычного для функции пролога-эпилога и не позволяет ей отложить место на стеке - это раз...

Задаче не нужен пролог и эпилог, OS занимается сохранением и восстановлением "порченных" регистров. А про "отложить место на стеке", я попробую проверить.
Цитата
Во вторых запуск задачи из другой задачи - мне кажется приведет к пролемам со стеком либо запускающей либо запущенной задачи...

Невижу причин возникновения проблем. Выделяется память из кучи под задачу (стек и т.п.) и ставиться в очередь на исполнение.
Цитата
По-любому запуск задачи - это совершенно иной процесс, чем вложенный вызов другой функции и тут надо быть осторожным...

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

Смотрел как оно создаётся, память выделяется из кучи своим аналогом malloc, стек используется только для вызова функций создающих задачу.
Чтобы понять как диспетчер запускает задачи, надо его весь изучить. Я надеюсь он достаточно вылизан.


Цитата
В описании RTOS нет прямого разрешение на исползование подзадач из задачи и все примеры сделаны так, что задачи запускаются именно из майн-функции или диспетчером задач - следовательно правильная работа в вашем варианте - никем не гарантируется...

Работа из main тоже не гарантируется biggrin.gif В доке вообще не написано где эти задачи можно создавать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.