реклама на сайте
подробности

 
 
18 страниц V  « < 13 14 15 16 17 > »   
Reply to this topicStart new topic
> Начало работы with scmRTOS, Несколько вопросиков
WHALE
сообщение Mar 8 2013, 19:28
Сообщение #211


Знающий
****

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



Что-то не идет у меня 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)
Что-бы это значило?

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



--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 8 2013, 20:18
Сообщение #212


Гуру
******

Группа: Свой
Сообщений: 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" забыто?
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 8 2013, 20:53
Сообщение #213


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 8 2013, 21:11
Сообщение #214


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

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


Цитата(WHALE @ Mar 8 2013, 22:53) *
прерывание обьявлено как приватная статическая функция класса.

Странно, ни видел такого, чтобы проблемы были...
Покажте код класса.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 8 2013, 22:04
Сообщение #215


Знающий
****

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



Цитата(_Артём_ @ Mar 9 2013, 01:11) *
Остаётся только в support жаловаться...

Смеетесь? crying.gif На то что ломанный ЯР глючит?

Цитата(_Артём_ @ 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 8 2013, 22:32
Сообщение #216


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(WHALE @ Mar 9 2013, 00:04) *
Смеетесь? crying.gif На то что ломанный ЯР глючит?

Не, а что? Только не ломаный, а триальный или 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?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2013, 02:04
Сообщение #217


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 9 2013, 05:26
Сообщение #218


Знающий
****

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



Цитата(Сергей Борщ @ Mar 9 2013, 06:04) *
Пусть автор сделает элементарный проект типа
Код
void main()
{
     if(UART.hasinput())
           UART.send(UART.receive());
}
который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.


Тут Ксения любезно выложила свежую версию ЯРа,попробую скомпилировать под ним.
Если не поможет, последую вашему совету.
Но наверное не сегодня( bb-offtopic.gif пиво после шампанского это зло wub.gif ).



--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 9 2013, 18:59
Сообщение #219


Знающий
****

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



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

С уважением.
Прикрепленные файлы
Прикрепленный файл  TEST.ZIP ( 749.25 килобайт ) Кол-во скачиваний: 10
 


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 9 2013, 19:55
Сообщение #220


Гуру
******

Группа: Свой
Сообщений: 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


Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 9 2013, 20:24
Сообщение #221


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 9 2013, 20:48
Сообщение #222


Гуру
******

Группа: Свой
Сообщений: 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 называлось, но где его генерация включалась я забыл...
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 9 2013, 21:19
Сообщение #223


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 9 2013, 21:55
Сообщение #224


Гуру
******

Группа: Свой
Сообщений: 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. То есть не понятно как при этом переключение задач произойдёт?
Опять наверное путаница из-за различия имён в разных мегах возникла...
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 9 2013, 22:20
Сообщение #225


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

18 страниц V  « < 13 14 15 16 17 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 10:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01563 секунд с 7
ELECTRONIX ©2004-2016