Перейти к содержанию
    

Что-то не идет у меня 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)

Что-бы это значило?

 

Не выходит каменный цветок...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

получаю

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" забыто?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно такой ошибки не видел, лет 5 уже наверное.

Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы).

Попробуйте опять на ATMega324P проект переключить, может заработает?

И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится.

 

Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает.

Если-бы эти всем и ограничилось-я-б не парился.

 

Может объявлено не правильно?

Или extern "C" забыто?

 

extern "C" не катит- прерывание обьявлено как приватная статическая функция класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что я только не пробовал.Проект раз 5 пересоздавал, опции почти все прокрутил по кругу-ничего не помогает.

Если-бы эти всем и ограничилось-я-б не парился.

Остаётся только в support жаловаться...

 

 

прерывание обьявлено как приватная статическая функция класса.

Странно, ни видел такого, чтобы проблемы были...

Покажте код класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Остаётся только в 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 оставляет.

Шайтан...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смеетесь? :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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Странно что один вектор выкидывает, другой - нет.

P.S.2 В таблице векторов эти вектора у вас есть или там RETI?

Пусть автор сделает элементарный проект типа
void main()
{
     if(UART.hasinput())
           UART.send(UART.receive());
}

который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пусть автор сделает элементарный проект типа
void main()
{
     if(UART.hasinput())
           UART.send(UART.receive());
}

который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.

 

Тут Ксения любезно выложила свежую версию ЯРа,попробую скомпилировать под ним.

Если не поможет, последую вашему совету.

Но наверное не сегодня( :bb-offtopic: пиво после шампанского это зло :wub: ).

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как и ожидалось,свежий яр не помог.Хотя че-то они там соптимизировали-ping на скомпилированном новым яром проекте при прочих равных уменьшился со 160 до 120ms.Хотя все равно дофига.Но сейчас борьба не с этим.

Напомню краткое содержание предыдущих серий-яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват.

Написал минимальный тестовый проект-все тоже самое.

Надеюсь на коллективный разум,бо своего не хватает. Проект прилагаю.

 

С уважением.

TEST.ZIP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как и ожидалось,свежий яр не помог.

Ничего удивительного.

 

яр выбрасывает внеосевой обработчик прерываний,если он объявлен как функция-член класса.Пофигу,паблик или приват.

Написал минимальный тестовый проект-все тоже самое.

//------------------------------------------------------------------------------/
        #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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего удивительного.

 

Не видите разницы в реализации 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 вектор присутствует.

Шайтан

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только инлайн не добавлял-вроде по стандарту реализация функии-члена в хидере это инлайн автоматом.

Да, 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 называлось, но где его генерация включалась я забыл...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таблице присутсвует, при возникновении прерывания переходит на вектор, то есть работает.

С чего же следует что Иар его выбросил?

 

Дык нету передачи массива через уарт,передается только первый байт.

Этот-же код без оси работает как часы и в мап-файле никаких записей о том,что

это нифига не прерывание нету-только таблица вызываемых функций.

 

Откуда вы это получили

 

? Кажется это Call graph называлось, но где его генерация включалась я забыл...

да вроде это не Call graph.

Просто на вкладке ЛИНКЕР->List включил генерацию мап-файла и выбрал

под ним все три опции генерации отчета.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык нету передачи массива через уарт,передается только первый байт.

Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания.

Запустил вашу программу в симуляторе - она всё время на 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. То есть не понятно как при этом переключение задач произойдёт?

Опять наверное путаница из-за различия имён в разных мегах возникла...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания.

Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть.

Может стеков не хватает или ещё что...

 

не-не не. у меня специально 2 фоновый процесс создан-там светик моргает,

значит задачи переключаются.

и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит.

 

Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть.

Может стеков не хватает или ещё что...

Стека там более чем достаточно на такую-то задачу.

А симулятору ОС крышу сносит напрочь своим переключением стековых фреймов,это да.

 

Ладно,пора спать,утро вечера мудренее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...