Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

IAR 4.30. Мистическое поведение с буфером обмена между двумя процессами 8-(

Отправлено Dikoy 09 ноября 2008 г. 20:58


Меня этот иар в могилу сгонит...
Целый день бьюсь над мега сложной задачей - записать массив в одной функции и считать в другой.
Ситуация такая. Есть протокол "PT", который гонит данные пакетами с периодом 140 мС, без запросов, чиса подряд. И есть другой протокол, CAS, запросный, который подразумевает запрос от ПК и возврат ему данных. Данные эти - вес. А протоколы применяются в весовом оборудовании. Надо сделать адаптор весов разных производителей в CAS протокол (для начала же надо сконвертировать хотя бы РТ в CAS).
Вот мне и надо написать конвертер этих протоколов для AT90USB1287.

Чтобы подружить эти два протокола, в ОЗУ меги я создал общий буфер. Принимаемые по UART данные туда кладутся, а при запросе от ПК через USB, данные из этого буфера считываются в USB.
Буфер создан в файле main.c и объявлен как:
volatile unsigned char DC1_Response[DC1_LEN] = {0x01, 0x02, 'S', ' ', '0', '0', '0', '.', '0', '0', 'k','g', 0, 0x03, 0x04};

Функции, которые принимают РТ протокол по UART и отвечают по USB размещены в файлах PT_task.c и cdc_task.c соответственно. Означенный буфер в них объявлен как:
extern volatile unsigned char DC1_Response[DC1_LEN];

И того, в файле PT_task.c по UART я принимаю поток данных РТ. В прерывании принимаю байты, определяю начало пакета, помещаю эти пакеты во временный буфер, там их конвертирую и т.д. Тут всё работает (для теста сливал в USB обработанные данные - всё ОК).
После окончания обработки и подготовки временного буфера я копирую его в DC1_Response лёгким движением руки:
for(j=4;j<10;j++) { DC1_Response[j] = temp_buf[j-4]; } //
Как видно, перезаписываются только 4-6 байты, отвечающие за значение веса. Остальные байты DC1_Response не изменяются (они и не должны меняться).
Что самое забавное, если теперь ради теста считать DC1_Response и отправить в USB, то в терминалке мы увидим то, что и ожидали - правильные конвертированные данные в обрамлении из дефолтных значений первых 4 и последних 5 байт буфера DC1_Response.

НО! Если теперь считать DC1_Response в файле cdc_task.c, как ответ на запрос, то в терминалке мы увидим полностью дефолтные значения DC1_Response, записанные в него при объявлении...

Ладно, пусть бы он просто некорректно обращался к буферу DC1_Response из файла cdc_task.c, считывал его во время записи в PT_task.c (хотя это и невозможно, т.к. эти операции софтварные и одновременно делаться не могут). Но ОТКУДА он умудряется брать дефолтные значения буфера, когда я его успешно перезаписываю каждые 140 мС!?????


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 34:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru