|
|
  |
Начало работы with scmRTOS, Несколько вопросиков |
|
|
|
Mar 8 2013, 20:18
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 8 2013, 21:28)  получаю Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 00667629 (reading from address 0x51) Путем плясок с бубном выяснил-помогает смена типа контроллера в проекте с ATMega324P на ATMega324. Если выбираю 324A или 324PA-таже ошибка. Что-за на?! Давно такой ошибки не видел, лет 5 уже наверное. Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы). Попробуйте опять на ATMega324P проект переключить, может заработает? И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится. Цитата(WHALE @ Mar 8 2013, 21:28)  Ладно,компилирую как ATMega324-выбрасывает из кода внеосевое прерывание USART1_TX_vect. В map-файле вижу следующее: 01 TUART1::SEND_DATA() ->Sub-tree of type: Indirectly called function tree that does not make : indirect calls (Is not an interrupt and is not flagged : as not overlayable) Может объявлено не правильно? Или extern "C" забыто?
|
|
|
|
|
Mar 8 2013, 20:53
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_Артём_ @ Mar 9 2013, 00:18)  Давно такой ошибки не видел, лет 5 уже наверное. Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы). Попробуйте опять на ATMega324P проект переключить, может заработает? И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится. Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает. Если-бы эти всем и ограничилось-я-б не парился. Цитата(_Артём_ @ Mar 9 2013, 00:18)  Может объявлено не правильно? Или extern "C" забыто? extern "C" не катит- прерывание обьявлено как приватная статическая функция класса.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 8 2013, 21:11
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 8 2013, 22:53)  Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает. Если-бы эти всем и ограничилось-я-б не парился. Остаётся только в support жаловаться... Цитата(WHALE @ Mar 8 2013, 22:53)  прерывание обьявлено как приватная статическая функция класса. Странно, ни видел такого, чтобы проблемы были... Покажте код класса.
|
|
|
|
|
Mar 8 2013, 22:04
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_Артём_ @ Mar 9 2013, 01:11)  Остаётся только в support жаловаться... Смеетесь?  На то что ломанный ЯР глючит? Цитата(_Артём_ @ Mar 9 2013, 01:11)  Странно, ни видел такого, чтобы проблемы были... Покажте код класса. Код uart.h
class TUART1 { ... #pragma vector=USART1_RX_vect static __interrupt void READ_DATA(void); #pragma vector=USART1_TX_vect static __interrupt void SEND_DATA(void); };
uart.c
__interrupt void TUART1::READ_DATA(void) { unsigned char data=UDR1; if (!(UCSR1A & (FRAMING_ERROR | DATA_OVERRUN) ) ) { OS::TISRW ISRW; message_uart_dev=data; message_uart_dev.send_isr(); } else counter_rx_device=0; }
__interrupt void TUART1::SEND_DATA(void) { if(counter_tx_device < len_tx_device) UDR1=buffer_tx_device[counter_tx_device++]; else counter_tx_device=len_tx_device=0; } SEND_DATA выбрасывает, READ_DATA оставляет. Шайтан...
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 8 2013, 22:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 9 2013, 00:04)  Смеетесь?  На то что ломанный ЯР глючит? Не, а что? Только не ломаный, а триальный или eval-версия. Напишите, что мол уже собрались купить их софтину, протестировали, уже деньги начали отсчитывать и тут - Internal Error какой-то...исправляйте иаровцы, а то не куплю. Цитата(WHALE @ Mar 9 2013, 00:04)  Код uart.h class TUART1 { ... #pragma vector=USART1_RX_vect static __interrupt void READ_DATA(void); #pragma vector=USART1_TX_vect static __interrupt void SEND_DATA(void); };
uart.c
__interrupt void TUART1::READ_DATA(void) { unsigned char data=UDR1; if (!(UCSR1A & (FRAMING_ERROR | DATA_OVERRUN) ) ) { OS::TISRW ISRW; message_uart_dev=data; message_uart_dev.send_isr(); } else counter_rx_device=0; }
__interrupt void TUART1::SEND_DATA(void) { if(counter_tx_device < len_tx_device) UDR1=buffer_tx_device[counter_tx_device++]; else counter_tx_device=len_tx_device=0; } SEND_DATA выбрасывает, READ_DATA оставляет. Шайтан... Попробуйте определение SEND_DATA и READ_DATA делать в h-файле. Или определить их в cpp-файле так: Код #pragma vector=USART1_RX_vect __interrupt void TUART1::READ_DATA(void) { //... }
#pragma vector=USART1_UDRE_vect __interrupt void TUART1::SEND_DATA(void) { //... } Если определить так(без #pragma vector): Код ///////#pragma vector=USART1_RX_vect __interrupt void TUART1::READ_DATA(void) { unsigned char data=UDR1; if (!(UCSR1A & 1) ) { rx_byte=UDR1; } else counter_rx_device=0; }
/////// #pragma vector=USART1_UDRE_vect __interrupt void TUART1::SEND_DATA(void) { if(counter_tx_device < len_tx_device) UDR1=buffer_tx_device[counter_tx_device++]; else counter_tx_device=len_tx_device=0; } то у меня IAR выдаёт такие предупреждения: Цитата Warning[Ta006]: Interrupt function has no assigned vector. P:\IAR_PROJECT\test_m324p\uart.c 5 Warning[Ta006]: Interrupt function has no assigned vector. P:\IAR_PROJECT\test_m324p\uart.c 17 У вас варнинги есть? Или как? Возможны наверное и другие варианты реализации... P.S. Странно что один вектор выкидывает, другой - нет. P.S.2 В таблице векторов эти вектора у вас есть или там RETI?
|
|
|
|
|
Mar 9 2013, 02:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (_Артём_ @ Mar 9 2013, 00:32)  P.S. Странно что один вектор выкидывает, другой - нет. P.S.2 В таблице векторов эти вектора у вас есть или там RETI? Пусть автор сделает элементарный проект типа CODE void main() { if(UART.hasinput()) UART.send(UART.receive()); } который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 9 2013, 05:26
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(Сергей Борщ @ Mar 9 2013, 06:04)  Пусть автор сделает элементарный проект типа Код void main() { if(UART.hasinput()) UART.send(UART.receive()); } который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать. Тут Ксения любезно выложила свежую версию ЯРа,попробую скомпилировать под ним. Если не поможет, последую вашему совету. Но наверное не сегодня(  пиво после шампанского это зло  ).
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 9 2013, 18:59
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Как и ожидалось,свежий яр не помог.Хотя че-то они там соптимизировали-ping на скомпилированном новым яром проекте при прочих равных уменьшился со 160 до 120ms.Хотя все равно дофига.Но сейчас борьба не с этим. Напомню краткое содержание предыдущих серий-яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват. Написал минимальный тестовый проект-все тоже самое. Надеюсь на коллективный разум,бо своего не хватает. Проект прилагаю. С уважением.
Прикрепленные файлы
TEST.ZIP ( 749.25 килобайт )
Кол-во скачиваний: 10
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 9 2013, 19:55
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 9 2013, 20:59)  Как и ожидалось,свежий яр не помог. Ничего удивительного. Цитата(WHALE @ Mar 9 2013, 20:59)  яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват. Написал минимальный тестовый проект-все тоже самое. Код //------------------------------------------------------------------------------/ #pragma vector=TIMER1_OVF_vect // 8c OS_INTERRUPT void Tuart1::timer1_ovf_isr(void) { OS::TISRW_SS ISRW; ef_timer1_Ovf.signal_isr(); } //------------------------------------------------------------------------------/ __interrupt void Tuart1::usart1_tx_isr(void) { if(counter_tx_uart1 < len_tx_uart1) UDR1=buffer_tx_uart1[++counter_tx_uart1]; else counter_tx_uart1=0; } Не видите разницы в реализации timer1_ovf_isr и usart1_tx_isr? #pragma vector отсутствует у Tuart1::usart1_tx_isr. На что Иар вам сообщает Цитата Warning[Ta006]: Interrupt function has no assigned vector. p:\Chuzhoj_kod\TEST\Src\main.cpp 85 Сделайте так: Код #pragma vector=USART1_TX_vect __interrupt void Tuart1::usart1_tx_isr(void) { if(counter_tx_uart1 < len_tx_uart1) UDR1=buffer_tx_uart1[++counter_tx_uart1]; else counter_tx_uart1=0; } //------------------------------------------------------------------------------/ или опишите usart1_tx_isr прямо в хидере (может ещё inline к нему добавьте). P.S. Почему вектор на передачу USART1_TX_vect, а не USART1_UDRE_vect? Это так задумано? Вроде TX_vect для другого. P.S.2. Куча каких-то ванингов Иар выдаёт на OS_Services.cpp и другие файлы. Раньше вроде их не было... Цитата Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) p:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Kernel.h 101 Remark[Pa109]: the unary minus operator is applied to an unsigned expression (with possibly unexpected results) p:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.h 66 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) p:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.h 147 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) p:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.h 150 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) p:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.h 165 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) P:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.cpp 53 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) P:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.cpp 56 Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) P:\Chuzhoj_kod\TEST\scmRTOSmutual\Common\OS_Services.cpp 72
|
|
|
|
|
Mar 9 2013, 20:24
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_Артём_ @ Mar 9 2013, 23:55)  Ничего удивительного. Не видите разницы в реализации timer1_ovf_isr и usart1_tx_isr? #pragma vector отсутствует у Tuart1::usart1_tx_isr. На что Иар вам сообщает Сделайте так: Код #pragma vector=USART1_TX_vect __interrupt void Tuart1::usart1_tx_isr(void) { if(counter_tx_uart1 < len_tx_uart1) UDR1=buffer_tx_uart1[++counter_tx_uart1]; else counter_tx_uart1=0; } //------------------------------------------------------------------------------/ или опишите usart1_tx_isr прямо в хидере (может ещё inline к нему добавьте). P.S. Почему вектор на передачу USART1_TX_vect, а не USART1_UDRE_vect? Это так задумано? Вроде TX_vect для другого. P.S.2. Куча каких-то ванингов Иар выдаёт на OS_Services.cpp и другие файлы. Раньше вроде их не было... Делал и так и этак. И с прагмой в .cpp(кстати у меня варнинга без #pragma vector нет) и в хидере описывал обработчик, только инлайн не добавлял-вроде по стандарту реализация функии-члена в хидере это инлайн автоматом. Все равно,редиска, выбрасывает обработчик с диагнозом Tuart1::usart1_tx_isr() ->Sub-tree of type: Indirectly called function tree that does not make : indirect calls (Is not an interrupt and is not flagged : as not overlayable). Хотя в таблице INTVEC вектор присутствует. Шайтан
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 9 2013, 20:48
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 9 2013, 22:24)  только инлайн не добавлял-вроде по стандарту реализация функии-члена в хидере это инлайн автоматом. Да, inline не нужен. Цитата(WHALE @ Mar 9 2013, 22:24)  Хотя в таблице INTVEC вектор присутствует. В таблице присутсвует, при возникновении прерывания переходит на вектор, то есть работает. С чего же следует что Иар его выбросил? Откуда вы это получили Цитата ->Sub-tree of type: Indirectly called function tree that does not make : indirect calls (Is not an interrupt and is not flagged : as not overlayable). ? Кажется это Call graph называлось, но где его генерация включалась я забыл...
|
|
|
|
|
Mar 9 2013, 21:19
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_Артём_ @ Mar 10 2013, 00:48)  В таблице присутсвует, при возникновении прерывания переходит на вектор, то есть работает. С чего же следует что Иар его выбросил? Дык нету передачи массива через уарт,передается только первый байт. Этот-же код без оси работает как часы и в мап-файле никаких записей о том,что это нифига не прерывание нету-только таблица вызываемых функций. Цитата(_Артём_ @ Mar 10 2013, 00:48)  Откуда вы это получили
? Кажется это Call graph называлось, но где его генерация включалась я забыл... да вроде это не Call graph. Просто на вкладке ЛИНКЕР->List включил генерацию мап-файла и выбрал под ним все три опции генерации отчета.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 9 2013, 21:55
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(WHALE @ Mar 9 2013, 23:19)  Дык нету передачи массива через уарт,передается только первый байт. Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания. Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... Цитата(WHALE @ Mar 9 2013, 23:19)  Просто на вкладке ЛИНКЕР->List включил генерацию мап-файла и выбрал под ним все три опции генерации отчета. У меня map такой получился: Цитата INTVEC Common segment, address: CODE 00000000 - 0000007B (0x7c bytes), align: 1 Segment part 19. ROOT. ENTRY ADDRESS REF BY ===== ======= ====== Tuart1::usart1_tx_isr()::??INTVEC 120 00000078
->Sub-tree of type: Interrupt function tree that does not make : indirect calls RSTACK CSTACK | Stack used (prev) : 00000004 00000017 01 Tuart1::usart1_tx_isr() | Stack used (prev) : 00000004 00000017 | + function block : 00000002 00000005 <-Sub-tree of type: Interrupt function tree that does not make : indirect calls | Stack used : 00000006 0000001C Вроде нормально всё. Цитата(WHALE @ Mar 9 2013, 23:19)  Дык нету передачи массива через уарт,передается только первый байт. Посмотрел ещё раз программу и не увидел вектора SPM_READY_vect. То есть не понятно как при этом переключение задач произойдёт? Опять наверное путаница из-за различия имён в разных мегах возникла...
|
|
|
|
|
Mar 9 2013, 22:20
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_Артём_ @ Mar 10 2013, 01:55)  Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания. Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... не-не не. у меня специально 2 фоновый процесс создан-там светик моргает, значит задачи переключаются. и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит. Цитата(_Артём_ @ Mar 10 2013, 01:55)  Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... Стека там более чем достаточно на такую-то задачу. А симулятору ОС крышу сносит напрочь своим переключением стековых фреймов,это да. Ладно,пора спать,утро вечера мудренее...
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|