|
C++, мучения в освоении и JTAG отладке |
|
|
|
Mar 18 2011, 08:16
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(Andy Mozzhevilov @ Mar 18 2011, 07:37)  Если uCOS инициализировать стандартным способом, т.е. вызовом из main(), то в ПО на С++ теряется возможность создавать объекты, использующие сервисы uCOS в конструкторах объектов, объявленных глобально, т.е. необходимо каждый раз прибегать к вызову дополнительной функции инициализации. С моей точки зрения, если внутри объекта к примеру используется семафор, логично, чтобы этот семафор создавался (выделялся) в конструкторе объекта. В этом случае после создания объекта он готов к использованию без дополнительных вызовов. Это как раз и решается нужной организацией стартапа (в части low_level_init()). Вспоминаю, что в примерах C++ приложений для тех модулей с UCOS и TCP/IP стеком, объекты вообще не применялись. Это были примеры, как использовать готовые библиотеки на C. Мне потребовалось только дописать свои задачи управления I2C, SPI и UART, связать их средствами UCOS. Инициализация периферии происходила в момент создания задач через UCOS, т.е. после main(). Честно говоря, я не понимаю, почему это плохо и неидейно.
|
|
|
|
|
Mar 18 2011, 08:24
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(Aprox @ Mar 18 2011, 11:16)  Вспоминаю, что в примерах C++ приложений для тех модулей с UCOS и TCP/IP стеком, объекты вообще не применялись. Это были примеры, как использовать готовые библиотеки на C. Мне потребовалось только дописать свои задачи управления I2C, SPI и UART, связать их средствами UCOS. Инициализация периферии происходила в момент создания задач через UCOS, т.е. после main(). Честно говоря, я не понимаю, почему это плохо и неидейно. Значит вы писали софт на Си, причем здесь С++?
--------------------
Пасу котов...
|
|
|
|
|
Mar 18 2011, 11:10
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(Andy Mozzhevilov @ Mar 18 2011, 11:24)  Значит вы писали софт на Си, причем здесь С++? Не совсем. Внутри задач я создавал и использовал объекты. Например строки. Правда, они не были глобальными и создавались методом new при запуске каждой задачи UCOS. Сейчас же, как я понимаю, вся проблема в том, что программные модули взаимодействуют напрямую, через общие глобальные объекты.
|
|
|
|
|
Mar 18 2011, 18:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Aprox @ Mar 18 2011, 15:10)  Не совсем. Внутри задач я создавал и использовал объекты. Например строки. Правда, они не были глобальными и создавались методом new при запуске каждой задачи UCOS. Сейчас же, как я понимаю, вся проблема в том, что программные модули взаимодействуют напрямую, через общие глобальные объекты. А кто вам сказал, что обычные объекты можно "запросто" использовать в многозадачных OS? Если объявлены глобальные объекты, совместно используемые в разных задачах (потоках), вам предстоит самому обеспечивать синхронизацию доступа к таким объектам. Для того и сделаны всякие там мьютексы, семафоры, критические секции. Вы почитайте книги про это, очень полезно.
|
|
|
|
|
Mar 19 2011, 09:30
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(sergeeff @ Mar 18 2011, 21:28)  А кто вам сказал, что обычные объекты можно "запросто" использовать в многозадачных OS? Если объявлены глобальные объекты, совместно используемые в разных задачах (потоках), вам предстоит самому обеспечивать синхронизацию доступа к таким объектам. Для того и сделаны всякие там мьютексы, семафоры, критические секции. Вы почитайте книги про это, очень полезно. Наверное неверно понимаете. Я писал, что сейчас работаю с проектом, в котором нет многозадачной real-time OS и поэтому взаимодействие программных модулей приходится производить через глобальные объекты. Разговор же про OS происходил по другому поводу- что в случае с многозадачной OS нет нужды городить глобальные объекты и, соответственно, не возникает проблем в С++ со "стартапами" периферии. Пример, в задаче управления UART, вся инициализации необходимой периферии производится в начале процедуры, которую назначили "задачей". Там же, внутри процедуры вызываются конструкторы объектов, например класса string. Получаем локальные, не глобальные объекты, которые созданы после main() и после всех стартапов. А уж передавать эти обьекты, вернее указатели на них, другим задачам, действительно можно через семафоры, очереди OS и прочие фифо.
|
|
|
|
|
Mar 23 2011, 13:18
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата 2. Вызвать из нее функцию статической инициализации iar Можно по подробней что это за функция что то в мануале не нашел ?
|
|
|
|
|
Mar 23 2011, 17:30
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(MALLOY2 @ Mar 23 2011, 16:18)  Можно по подробней что это за функция что то в мануале не нашел ? Точку входа можно найти, прошагав в отладчике стартап. Обычно с iar можно найти исходники статической и динамической инициализации, которые используются в startup. Завтра на работе посмотрю точно, что я вызываю в low_level_init()
--------------------
Пасу котов...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|