|
Инициализация периферии до входа в main() - возможно ли?, RealView compiler |
|
|
|
Jan 9 2009, 05:32
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Не полагайся на порядок вызовов конструкторов, инициализаторов периферии и тд - легко словить грабли в дальнейшем. У меня все сервисы имеют три стадии инициализации: 1) Собственно сами конструкторы классов. В них я предполагаю, что класс автономен, соответственно и не обращаюсь к другим классам и ресурсам. Здесь же инициализируется периферия (естественно, два класса не могут юзать одну и ту же периферию) 2) Стадия Init - здесь уже налаживаются связи между классами (к этому моменту все необходимые объекты уже созданы) 3) Стадия Run - запускается таски, разрешаются прерывания от периферии и тд - в общем, нормальная работа приложения объекты глобальные, соответственно создаются до main. А в main я уже вызываю init и run. Суть в чем - не полагайся, что кто-то что-то сделал заранее
|
|
|
|
|
Jan 9 2009, 11:27
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Dima_G @ Jan 9 2009, 09:32)  Не полагайся на порядок вызовов конструкторов, инициализаторов периферии и тд - легко словить грабли в дальнейшем. У меня все сервисы имеют три стадии инициализации: 1) Собственно сами конструкторы классов. В них я предполагаю, что класс автономен, соответственно и не обращаюсь к другим классам и ресурсам. Здесь же инициализируется периферия (естественно, два класса не могут юзать одну и ту же периферию) 2) Стадия Init - здесь уже налаживаются связи между классами (к этому моменту все необходимые объекты уже созданы) 3) Стадия Run - запускается таски, разрешаются прерывания от периферии и тд - в общем, нормальная работа приложения объекты глобальные, соответственно создаются до main. А в main я уже вызываю init и run. Суть в чем - не полагайся, что кто-то что-то сделал заранее  Понятно, спасибо! Хотя не всегда объект может иметь свою собственную периферию - в случае её совместного использования невозможно ввести полную инициализацию внутрь одного класса.
|
|
|
|
|
Jan 10 2009, 17:30
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(sonycman @ Jan 9 2009, 14:27)  Понятно, спасибо! Хотя не всегда объект может иметь свою собственную периферию - в случае её совместного использования невозможно ввести полную инициализацию внутрь одного класса. Это уже следующий шаг  . Тут уже соблюдаю правило - на каждую периферию - свой объект (можно назвать драйвером). Те работа всех объектов с УАРТом идет не напрямую, а через объект - драйвер УАРТ. Или работа с езернетом - получен кадр - сервис-драйвер езернета отправляет его всем желающим (фактически в моем Enviromnet это выглядит как broadcast пакет. Чем-то идеология на CANbus похожа  ) Сам понимаешь, при таком подходе легче обходятся грабли с синхронизацией доступа к ресурсу..
|
|
|
|
|
Jan 10 2009, 20:51
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Dima_G @ Jan 10 2009, 21:30)  Сам понимаешь, при таком подходе легче обходятся грабли с синхронизацией доступа к ресурсу.. Да, синхронизация - дело хитрое. Вот, к примеру думал тут недавно над одной задачкой... В общем, есть два канала SPI. И три объекта, "висящие" на них. Первый - цветной ЖКИ, скорость 12 Мбит, огромные объёмы данных, способен занять канал на длительное время. Самый низкий приоритет. Второй - диск на флешке. Скорость высокая, но пакеты небольшие - сектора по несколько сот/тысяч байт. Средний приоритет. И третий - к примеру - декодер МП3 (или ЦАП) или другой девайс с относительно маленьким каналом, но требующий быстрой реакции на запрос. Как их уместить на одном/двух каналах SPI, чтобы не умереть от геморроя с разделением ресурсов?
|
|
|
|
|
Jan 11 2009, 03:12
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(sonycman @ Jan 10 2009, 22:51)  Как их уместить на одном/двух каналах SPI, чтобы не умереть от геморроя с разделением ресурсов? Два варианта: A) ЖКИ транзакцию прервать никак нельзя: SPI1 - ЦАП и FS. (в худшем случае ЦАПу придется дождаться завершения передачи текущего сектора FS, но скорость FS выская поэтому ждать не долго). SPI2 - ЖКИ. Приоритет ЦАПа сделать более высоким чем приоритет FS. Б) ЖКИ транзакцию прервать без потерь можно. SPI1 - FS SPI2 - ЦАП и ЖКИ обмен с ЖКИ моментально прерывается процессом обслуживающим ЦАП, и возобновляется после. FS и ЖКИ я бы старался не цеплять на один интерфейс, во-первых чтобы скорость SPI не переключать (SPI флеш может и на 25Mhz и выше свистеть), ну и чтобы снизить нагрузку на интерфейс, т.к. потоки данных (по суммарному объему) сравнимые.
|
|
|
|
|
Jan 11 2009, 03:26
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(sonycman @ Jan 11 2009, 00:51)  Да, синхронизация - дело хитрое. Вот, к примеру думал тут недавно над одной задачкой...
В общем, есть два канала SPI. И три объекта, "висящие" на них. Первый - цветной ЖКИ, скорость 12 Мбит, огромные объёмы данных, способен занять канал на длительное время. Самый низкий приоритет. Второй - диск на флешке. Скорость высокая, но пакеты небольшие - сектора по несколько сот/тысяч байт. Средний приоритет. И третий - к примеру - декодер МП3 (или ЦАП) или другой девайс с относительно маленьким каналом, но требующий быстрой реакции на запрос.
Как их уместить на одном/двух каналах SPI, чтобы не умереть от геморроя с разделением ресурсов? Я бы сделал так: два объекта драйвера - ClSPI_Driver<SPI0> и ClSPI_Driver<SPI1>. Следующий шаг - выяснить, необходима ли атомарность передачи больших объемов к ЖКИ (те можно ли бить данные на мелкие пакеты). Если можно передавать только здоровыми кусками (соответственно, остальные девайсы на SPI будут курить бабмбук в это время, что недопустимо), то под ЖКИ придется выделять отдельный канал SPI. А остальные девайсы повесил бы на второй SPI. Разделение приоритетов передачи данных на одном порту: Создаешь в драйвере очереди запросов с различными приоритетами. И драйвер, закончив очередную транзакцию начинает проверять очереди и высылать данные в порядке порядке приоритетов. Те пока не высланы данные для декодера (real-time приоритет), не трогать данные для флешки - low-prioritet для этого канала. Те в общем, механизм был бы такой - ЖКИ единолично работает со своим SPI + канал DMA (драйвер<1>). На втором канале драйвер<2> выгребает данные из low-priority очереди (для флешки). А отдельный таск (или обработчик таймера) периодически подкидывает драйверу<2> блоки данных для декодера, который он отправляет за время не худшее, чем максимальный_объем_пакета_для_флешки / скорость_SPI + время реакции драйвера. В общем, как-то так
|
|
|
|
|
Jan 11 2009, 10:52
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(defunct @ Jan 11 2009, 07:12)  FS и ЖКИ я бы старался не цеплять на один интерфейс, во-первых чтобы скорость SPI не переключать (SPI флеш может и на 25Mhz и выше свистеть), ну и чтобы снизить нагрузку на интерфейс, т.к. потоки данных (по суммарному объему) сравнимые. Цитата(Dima_G @ Jan 11 2009, 07:26)  В общем, как-то так  Спасибо большое! Буду руководствоваться вашими советами, когда, наконец, руки до этого проекта дойдут. Вы мне очень помогли
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|