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

 
 
> Атрибут naked при объявлении задачи, FreeRTOS
Terminator
сообщение Oct 8 2007, 02:33
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



В доке к 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, работает.
Кто сталкивался? Подскажите где искать ошибку?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Николай Z
сообщение Oct 8 2007, 06:37
Сообщение #2


Местный
***

Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930



Цитата(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, работает.
Кто сталкивался? Подскажите где искать ошибку?


Ошибка в том, что задача не должна создаваться изнутри другой задачи...
Для этого есть майн-функция из которой задачи создаются и запускаются...
Еще задачи могут создаваться, запускаться и уничтожаться из "диспетчера" задач, который собственно переключает контексты задач...
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 9 2007, 02:20
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



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

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

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

Ещё вопрос назрел.
В демке FreeRTOS есть 3 модели распределения памяти. Последняя с использованием библиотечных malloc, free.
Вот оно почему-то не работает. При запуске создаётся две задачи, приложение и idle. Так вот приложение никогда не получает управление. Смотрел пошаговое выполнение, все выделения памяти выполняются вроде правильно.
Куда копать?
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 9 2007, 09:02
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Перенос создания всех задач в main, помог.
Теперь объявил все задачи, включая саму main, naked и ничего не упало.
Почему заработало я так и не понял sad.gif

Вопрос про память всё ещё актуален
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2007, 10:04
Сообщение #5


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
Николай Z
сообщение Oct 9 2007, 19:20
Сообщение #6


Местный
***

Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930



Цитата(Terminator @ Oct 9 2007, 06:20) *
Что-то не нашёл в доке про FreeRTOS ограничений по созданию задач.
Если объявить без атрибута naked то всё работает, в том числе и создание новых задач из других задач.

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

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


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

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

В описании RTOS нет прямого разрешение на исползование подзадач из задачи и все примеры сделаны так, что задачи запускаются именно из майн-функции или диспетчером задач - следовательно правильная работа в вашем варианте - никем не гарантируется...
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 10 2007, 01:45
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(Сергей Борщ @ 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 В доке вообще не написано где эти задачи можно создавать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:39
Рейтинг@Mail.ru


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