|
|
  |
Порт для Atmel ARM (IAR), Зачем нужно переопределять __low_level_init()? |
|
|
|
Feb 25 2009, 07:16
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Принимайте в свои ряды Почитал про scmRTOS и она мне очень понравилась, начал изучать. Раньше сидел на uCos, но она достаточно монстрообразная, да и С++ хочется, ибо на нем есть уже куча своих библиотек. В принципе, оно завелось и заработало, только не понятно, зачем нужно выносить инициализацию PLL, системного таймера и проч. в __low_level_init()? Там же имхо нет ничего критичного, что надо было бы обязательно выполнить до инициализации аппаратных стеков и переменных? Для пробы перенес весь код из __low_level_init() в обычную функцию main(), в самое начало. А именно, PLL, прерывания вообще (это уже свое собственное), системный таймер, прерывание смены контекста. Все работает нормально. Где скрытый смысл "влезать" в процесс инициализации камня?
|
|
|
|
|
Feb 25 2009, 07:32
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(MrYuran @ Feb 25 2009, 10:22)  Смысл наверно в том, чтобы отделить платформозависимую инициализацию от общей унифицированной программы Сомневаюсь, что именно в этом. Что значит "отделить"? К примеру, программа использует несколько пинов для управления светодиодами. Безусловно, порт надо проинициализировать. Это будет "платформозависимая инициализация" или "общая унифицированная программа"? Это я к тому, что "основная" прогрмма все равно делает инициализацию себя. Ведь ее никто в __low_level_init() или в cstartup.s не сует. Можно конечно, но зачем писать лишние буквы вроде указания сегмента ICODE и проч., если можно просто вместо void main() { OS::Run(); } написать void main() { SystemInit(); OS::Run(); } ИМХО __low_level_init() нужно менять, если мы хотим повлиять на инициализацию глобальных переменных, стеков и т.п. Возможно, именно это иногда и применялось авторами данной ОС. Вот я и задаю вопрос их опыту: когда может понадобиться ранняя инициализация?
|
|
|
|
|
Feb 25 2009, 08:05
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 25 2009, 11:14
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Сергей Борщ @ Feb 25 2009, 11:05)  __low_level_init() выполняется до вызова конструкторов статических объектов. Спасибо. Именно об этой причине я и не подумал.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|