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

 
 
 
Reply to this topicStart new topic
> Порт для Atmel ARM (IAR), Зачем нужно переопределять __low_level_init()?
gladov
сообщение Feb 25 2009, 07:16
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Принимайте в свои ряды smile.gif
Почитал про scmRTOS и она мне очень понравилась, начал изучать. Раньше сидел на uCos, но она достаточно монстрообразная, да и С++ хочется, ибо на нем есть уже куча своих библиотек.
В принципе, оно завелось и заработало, только не понятно, зачем нужно выносить инициализацию PLL, системного таймера и проч. в __low_level_init()? Там же имхо нет ничего критичного, что надо было бы обязательно выполнить до инициализации аппаратных стеков и переменных? Для пробы перенес весь код из __low_level_init() в обычную функцию main(), в самое начало. А именно, PLL, прерывания вообще (это уже свое собственное), системный таймер, прерывание смены контекста. Все работает нормально. Где скрытый смысл "влезать" в процесс инициализации камня?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 25 2009, 07:22
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Смысл наверно в том, чтобы отделить платформозависимую инициализацию от общей унифицированной программы


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
gladov
сообщение Feb 25 2009, 07:32
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(MrYuran @ Feb 25 2009, 10:22) *
Смысл наверно в том, чтобы отделить платформозависимую инициализацию от общей унифицированной программы


Сомневаюсь, что именно в этом. Что значит "отделить"? К примеру, программа использует несколько пинов для управления светодиодами. Безусловно, порт надо проинициализировать. Это будет "платформозависимая инициализация" или "общая унифицированная программа"? smile.gif
Это я к тому, что "основная" прогрмма все равно делает инициализацию себя. Ведь ее никто в __low_level_init() или в cstartup.s не сует. Можно конечно, но зачем писать лишние буквы вроде указания сегмента ICODE и проч., если можно просто вместо
void main()
{
OS::Run();
}
написать
void main()
{
SystemInit();
OS::Run();
}

ИМХО __low_level_init() нужно менять, если мы хотим повлиять на инициализацию глобальных переменных, стеков и т.п. Возможно, именно это иногда и применялось авторами данной ОС. Вот я и задаю вопрос их опыту: когда может понадобиться ранняя инициализация?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 25 2009, 07:45
Сообщение #4


;
******

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



Может, скажу очень недалекую вещь, но пользовался low_level_init() только для того, чтобы было меньше букафф для программирования вышеозначенной периферии на С вместо асма
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 25 2009, 07:48
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Как-то на форуме этот вопрос уже поднимался. Принято, что к моменту вызова main() система была полностью инициализирована, как hardware, так и software.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 25 2009, 07:55
Сообщение #6


;
******

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



Цитата(sergeeff @ Feb 25 2009, 10:48) *
Принято, что к моменту вызова main() система была полностью инициализирована, как hardware, так и software.


Оно и понятно - main() может быть и осевым.
Только для софтового инита еще рановато -он должен вызываться прямо перед main()
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2009, 08:05
Сообщение #7


Гуру
******

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



Цитата(gladov @ Feb 25 2009, 09:16) *
Где скрытый смысл "влезать" в процесс инициализации камня?
Во-первых, на момент вызова __low_level_init() стеки уже проинициализированы.

Во-вторых, если мы разгоним PLL до иницииализации переменных, инициализация пойдет быстрее. AT91SAM7, например, стартует на ~32КГц.

В-третьих, __low_level_init() выполняется до вызова конструкторов статических объектов. Часто статические объекты описывают некие внешние устройства и очень удобно разместить в конструкторе инициализацию этого внешнего устройства. И к моменту вызова инициализации, скажем, spi_flash, набортный SPI уже должен быть настроен. spi_flash может быть унаследован от spi, но проводить инициализацию интерфейса в конструкторе spi некорректно, ибо от него могут быть унаследованы другие устройства и тогда инициализация будет выполнена несколько раз.


--------------------
На любой вопрос даю любой ответ
"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
gladov
сообщение Feb 25 2009, 11:14
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(Сергей Борщ @ Feb 25 2009, 11:05) *
__low_level_init() выполняется до вызова конструкторов статических объектов.


Спасибо. Именно об этой причине я и не подумал.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Mar 1 2009, 05:30
Сообщение #9


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А ещё можно разместить переменные во внешней динамической памяти. Но при старте процессора контроллер DRAM ещё не работает поэтому иинициализация/обнуление переменных не сработает. Чтобы всё было пучком нужно в __low_level_init разместить инициализацию контроллера DRAM.

Ещё одно заманчивое предложение - разместить в DRAM стеки. Но с этим нужно осторожно. Текущий стек процедуры __low_level_init (стек System) может и не удастся там разместить (хотя если процедуру писать на асме, то можно рискнуть), а вот другие стеки вполне можно в DRAMе держать. Только с разрешением прерываний в __low_level_init поосторожней до инициализации DRAM.

Сообщение отредактировал GetSmart - Mar 1 2009, 06:19


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:04
Рейтинг@Mail.ru


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