WHILE 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Что-то не идет у меня scmRTOS. Пытаюсь перепилить на RTOS ещё один проект-контроллер ATMega324P,компилятор IAR 6.20.1-получаю Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 00667629 (reading from address 0x51) Путем плясок с бубном выяснил-помогает смена типа контроллера в проекте с ATMega324P на ATMega324. Если выбираю 324A или 324PA-таже ошибка. Что-за на?! Ладно,компилирую как 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) Что-бы это значило? Не выходит каменный цветок... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба получаю Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 00667629 (reading from address 0x51) Путем плясок с бубном выяснил-помогает смена типа контроллера в проекте с ATMega324P на ATMega324. Если выбираю 324A или 324PA-таже ошибка. Что-за на?! Давно такой ошибки не видел, лет 5 уже наверное. Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы). Попробуйте опять на ATMega324P проект переключить, может заработает? И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится. Ладно,компилирую как 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" забыто? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Давно такой ошибки не видел, лет 5 уже наверное. Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы). Попробуйте опять на ATMega324P проект переключить, может заработает? И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится. Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает. Если-бы эти всем и ограничилось-я-б не парился. Может объявлено не правильно? Или extern "C" забыто? extern "C" не катит- прерывание обьявлено как приватная статическая функция класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает. Если-бы эти всем и ограничилось-я-б не парился. Остаётся только в support жаловаться... прерывание обьявлено как приватная статическая функция класса. Странно, ни видел такого, чтобы проблемы были... Покажте код класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Остаётся только в support жаловаться... Смеетесь? :crying: На то что ломанный ЯР глючит? Странно, ни видел такого, чтобы проблемы были... Покажте код класса. 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 оставляет. Шайтан... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Смеетесь? :crying: На то что ломанный ЯР глючит? Не, а что? Только не ломаный, а триальный или eval-версия. Напишите, что мол уже собрались купить их софтину, протестировали, уже деньги начали отсчитывать и тут - Internal Error какой-то...исправляйте иаровцы, а то не куплю. 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 132 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба P.S. Странно что один вектор выкидывает, другой - нет. P.S.2 В таблице векторов эти вектора у вас есть или там RETI? Пусть автор сделает элементарный проект типа void main() { if(UART.hasinput()) UART.send(UART.receive()); } который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Пусть автор сделает элементарный проект типа void main() { if(UART.hasinput()) UART.send(UART.receive()); } который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать. Тут Ксения любезно выложила свежую версию ЯРа,попробую скомпилировать под ним. Если не поможет, последую вашему совету. Но наверное не сегодня( :bb-offtopic: пиво после шампанского это зло :wub: ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Как и ожидалось,свежий яр не помог.Хотя че-то они там соптимизировали-ping на скомпилированном новым яром проекте при прочих равных уменьшился со 160 до 120ms.Хотя все равно дофига.Но сейчас борьба не с этим. Напомню краткое содержание предыдущих серий-яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват. Написал минимальный тестовый проект-все тоже самое. Надеюсь на коллективный разум,бо своего не хватает. Проект прилагаю. С уважением. TEST.ZIP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Как и ожидалось,свежий яр не помог. Ничего удивительного. яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват. Написал минимальный тестовый проект-все тоже самое. //------------------------------------------------------------------------------/ #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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Ничего удивительного. Не видите разницы в реализации 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 вектор присутствует. Шайтан Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба только инлайн не добавлял-вроде по стандарту реализация функии-члена в хидере это инлайн автоматом. Да, inline не нужен. Хотя в таблице 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 называлось, но где его генерация включалась я забыл... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба В таблице присутсвует, при возникновении прерывания переходит на вектор, то есть работает. С чего же следует что Иар его выбросил? Дык нету передачи массива через уарт,передается только первый байт. Этот-же код без оси работает как часы и в мап-файле никаких записей о том,что это нифига не прерывание нету-только таблица вызываемых функций. Откуда вы это получили ? Кажется это Call graph называлось, но где его генерация включалась я забыл... да вроде это не Call graph. Просто на вкладке ЛИНКЕР->List включил генерацию мап-файла и выбрал под ним все три опции генерации отчета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Дык нету передачи массива через уарт,передается только первый байт. Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания. Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... Просто на вкладке ЛИНКЕР->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 Вроде нормально всё. Дык нету передачи массива через уарт,передается только первый байт. Посмотрел ещё раз программу и не увидел вектора SPM_READY_vect. То есть не понятно как при этом переключение задач произойдёт? Опять наверное путаница из-за различия имён в разных мегах возникла... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 марта, 2013 Опубликовано 9 марта, 2013 · Жалоба Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания. Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... не-не не. у меня специально 2 фоновый процесс создан-там светик моргает, значит задачи переключаются. и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит. Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть. Может стеков не хватает или ещё что... Стека там более чем достаточно на такую-то задачу. А симулятору ОС крышу сносит напрочь своим переключением стековых фреймов,это да. Ладно,пора спать,утро вечера мудренее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться