Easyelectronics.ru

Электроника для всех
Текущее время: 25 янв 2022, 10:43

Часовой пояс: UTC + 5 часов


Правила форума


Входить исключительно со своей туалетной бумагой. Можно невозбранно получить по голове за быдляк и личные наезды.


JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Инициализация железа
СообщениеДобавлено: 08 июн 2015, 18:32 
Только пришел

Зарегистрирован: 25 дек 2011, 18:26
Сообщения: 17
Уже не раз задумывался над этой проблемой. В общем сейчас в микроконтроллерах куча всякой периферии, и зачастую, к примеру пины контроллера, разделяют между собой разные аппаратные модули. Как все это инициализировать?
Я вижу два подхода - модуль инициализации, который настраивает общее для всех оборудование, а затем уже программные модули, обслуживающие конкретные аппаратные части, настраивают их как нужно. Второй - программные модули, обслуживающие аппаратуру, настраивают все - и общую часть и специфическую.
В первом случае мне не нравится то, что код работы с аппаратурой размазывается по проекту (тут я настроил пины, отвечающие за АЦП, DMA каналы, а потом в другой части - сам АЦП врубил и сконфигурировал). Во втором подходе плохо то, что при увеличении проекта возникают конфликты - случайно настроил на один и тот же пин АЦП и USART и ищи потом, где косяк. Но зато модули получаются более независимые, можно перетащить в другой проект с минимальными изменениями.
В общем вот так, может кто использует другие подходы, или литература есть какая почитать, как бороться с этой сложностью? А возможно я выдумал проблему и её нету, т.к. конкретно таких тем, что-то не находил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 08 июн 2015, 18:57 
Старожил

Зарегистрирован: 25 авг 2011, 14:00
Сообщения: 3378
LeonidPr писал(а):
возможно я выдумал проблему и её нету, т.к. конкретно таких тем, что-то не находил.
В общем-то да.
LeonidPr писал(а):
при увеличении проекта возникают конфликты - случайно настроил на один и тот же пин АЦП и USART и ищи потом, где косяк
Это лечится только планировкой архитектуры и написанием документации. Подобные проблемы возникают только в костыль-driven bydlokoding.

Сейчас большинство производителей (ST, TI, Atmel, Cypress) предлагают графический софт для создания кода инициализации периферии. Соответственно проблема пропадает сама собой, надо только уметь грамотно использовать библиотеки. Если же пишется свой HAL, то стоит посмотреть как это сделано у других, чтобы например функция настройки одного пина не сбивала настройку остальных пинов в порту.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 08 июн 2015, 22:54 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2257
LeonidPr писал(а):
Я вижу два подхода - модуль инициализации, который настраивает общее для всех оборудование, а затем уже программные модули, обслуживающие конкретные аппаратные части, настраивают их как нужно. Второй - программные модули, обслуживающие аппаратуру, настраивают все - и общую часть и специфическую

Можно ещё оба подхода совместить - общего модуля инициализации нет, модули настраивают всё сами, но все эти настройки хранятся в отдельных файлах для каждого модуля, сколько модулей - столько файлов инициализации. А во время работы над конкретным проектом, с конкретным набором модулей, все эти файлы просто сливаются в один общий файл инициализации проекта, который можно просмотреть, поправить если надо и дальше уже с ним работать.
А почему тема в холиварах ? )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 08 июн 2015, 23:40 
Только пришел

Зарегистрирован: 25 дек 2011, 18:26
Сообщения: 17
count_enable писал(а):
надо только уметь грамотно использовать библиотеки.

х-м-м, согласен с вами, только вот иногда эти библиотеки несколько перегружены как мне кажется (возможно я чего-то недопонимаю). Да, я использую например ST-шные библиотеки, но для инициализации более-менее сложной периферии (CAN, USB), а простую стараюсь своим кодом.
count_enable писал(а):
графический софт

Да, очень удобная штука, если нормально сделано. STM32CubeMX пока вроде ругают, да и сам на некоторые глюки натыкался.
vt340, ваш вариант то же хорош, но править то лучше не конечный файл, а те исходные ( а то каждый раз править придется, как только их сольеш в один), а это уже похоже на один из моих подходов.
Я вот тут подумал, надо посмотреть связку U-Boot + Linux, там же U-Boot почву готовит, а потом Линух уже инициализирует в драйверах то что надо. Может какие мысли придут.
А тему в холиварах, потому что подумал, что холиварная тематика (я так инициализирую, а я так и началось ))) ) Хотя возможно надо было в "Щас скажу..."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 09 июн 2015, 11:48 
Заглядывает иногда

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 51
Есть такая штука - програмные секции или сегмены.
К примеру WinAVR выстраивает эти секции строго в определенном порядке,
к примеру
Код:

;....

.init0
.init1
.init2
;....
.init8
.init9

;...

.fini9
.fini8
;...
.fini2
.fini1
.fini0
;...
.text
;...


к примеру есть модуль для UART

Код:

;...

  .section .init1
  ;сдесь все для начальной настройки

;...

  .section .init5
  ;более тонка настройка
  ;(может быть уже разрешены прерывания в секции .init3)

;...

.section .text
;всякие обработчики прерываний и прочей лабуды
 



а в основном модуле

Код:

  .section .init0
;настраиваем стек и что-то очень критическое

;...

.section .init9
;наконец можно разрешить прерывания (если надо)
;ну и как обычно зациклить программу.



Т.е. модуль сам знает как себя настроить и практически стновится самостоятельным
если его надо использовать в другом проекте - просто подключаем и все взлетело.

Ну это для WinAvr.
avsim (ассемблер и пр. для 80**) в линкере можно явно указать очередность сегментов.
Keil вроде тоже это позволяет.
А вот в MpLab чего-то похожего не нашел. Даже не смог найти, как указать, из какого каталога брать *.inc файлы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 09 июн 2015, 12:35 
Только пришел

Зарегистрирован: 25 дек 2011, 18:26
Сообщения: 17
т.е. вы не делаете отдельные подпрограммы для инициализации, а у вас просто кон на ассемблере, лежащий в своей секции, а потом вы из таких блочков набираете полный блок кода? м-м-м, для ассемблера может так и можно, а для Си мне кажется не особо удобно. А в MpLab это делается в настройках Project->Build options->Project->Directories->Assembler include search path


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инициализация железа
СообщениеДобавлено: 09 июн 2015, 13:08 
Заглядывает иногда

Зарегистрирован: 14 ноя 2014, 15:16
Сообщения: 51
Да, ассемблер, из отдельных кусочков собирается код.
Я такое подсмотрел в RTL от Borland - удивило, что какой-то код, а возврата из него нет.
В С вроде тоже можно указать в какой сегменте должна находиться функция.
А в MpLab на этой закладке (Directories).
всего 4 пункта:
Output Directory
Intermediary Directory
Library Serch Path
Linker-Script Serch Path
хотя в Help-е ссылка на Assembler Include Serch Path сылка есть...
MpLab 8.80.00.00


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB