Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Начало работы with scmRTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Страницы: 1, 2, 3, 4, 5, 6
a9d
Версия новая и там находится только OS_SystemTimer_ISR
ReAl
Цитата(a9d @ Nov 14 2012, 15:45) *
порт AVR
scmRTOS_TARGET_CFG.h
Ффухх, я уже за порт испугался.
Спасибо, подправлю как-нибудь те недочистки.
Только не «порт AVR», а «примеры к порту AVR/IAR».
В AVR/GCC вообще всё в порядке и в порту и в примерах, а в AVR/IAR порт в порядке, а в примерах недочищено.

Цитата(a9d @ Nov 14 2012, 15:45) *
Если scmRTOS_CONTEXT_SWITCH_SCHEME =1 , то пользователю нужно в обязательном порядке писать обработчик системного таймера.
Не нужно.
Посмотрите примеры 2 и 3, они в репозитории лежат с scmRTOS_CONTEXT_SWITCH_SCHEME 1 и они так прекрасно собираются. Сборка проверялась и с 0, и с 1, только для scmRTOS_CONTEXT_SWITCH_SCHEME 0 ещё нужно scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 0

В OS_Target_cpp.cpp лежит самодостаточный обработчик, который подключается и работает при любых настройках scmRTOS, так как не охвачен никакими условиями.
Код
//------------------------------------------------------------------------------
#pragma vector=SYSTEM_TIMER_VECTOR
OS_INTERRUPT void OS_SystemTimer_ISR()
{
    scmRTOS_ISRW_TYPE ISR;

#if scmRTOS_SYSTIMER_HOOK_ENABLE == 1
    system_timer_user_hook();
#endif

    Kernel.system_timer();

#if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 1
    ENABLE_NESTED_INTERRUPTS();
#endif

}
и те предварительные объявления на данный момент никому не нужны и никому не мешают.
Вот только что на всякий случай проверил -- в виртуалке стоит EWB 5.51, пересобрал все примеры.
a9d
Как подключить CLIB и DLIB к проекту одновременно? Без DLIB не собирается scmRTOS, без CLIB нет printf_P

все. Заменил на printf
a9d
из документации
Цитата
адрес указателя стека текущего процесса, куда будет помещен сам указатель по окончании сохранения контекста текущего процесса.


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

Передача с программным прерывание лучше, потому-что при входе в прерывание компилятор не сохранит/воcстановит локальный контекс ?
dezna
всем добрый день!
подскажите пожалуйста можно ли принудительно вызвать деструктор TCritSect не дожидаясь конца блока, когда это сделает компилятор?
и если да, то как это организовать?
Сергей Борщ
QUOTE (dezna @ Feb 18 2013, 09:06) *
принудительно вызвать деструктор TCritSect не дожидаясь конца блока
Извратившись - можно. Но что произойдет, когда дойдя до конца блока этот деструктор будет вызван снова? Возмжно имеет смысл чуток переписать программу, чтобы конец блока оказался в нужном месте? Возможно стоит вынести кусок кода в отдельную функцию, по return будет вызван деструктор.
dezna
Цитата(Сергей Борщ @ Feb 18 2013, 12:18) *
Возможно стоит вынести кусок кода в отдельную функцию, по return будет вызван деструктор.

как начал, так и бросил! только граблей понавтыкаю.
я использую стм-овский драйвер SD карты. сейчас пробую руками запрещать/разрешать прерывания.
пока успеха не добился. возможно и придётся переписать их драйвер под ОС. sad.gif
IgorKossak
Цитата(Сергей Борщ @ Feb 18 2013, 10:18) *
Возможно стоит вынести кусок кода в отдельную функцию...

Или обрамить блоком нужный кусок и в начале этого блока объявить TCritSect cs.
dezna
Цитата(IgorKossak @ Feb 18 2013, 22:18) *
Или обрамить блоком нужный кусок и в начале этого блока объявить TCritSect cs.

спасибо. как раз в тему.
WHALE
Господа, возник следующий вопрос - насколько падает производительность системы с РТОС по сравнению с суперлупом при прочих равных? Я понимаю, что что она должна упасть(этот момент хорошо расписано в руководстве по scmRTOS), но вот насколько?
Опишу свою ситуацию. С недавних пор решил перейти на работу с РТОС, т.к. надоело каждый раз организовывать "закат солнца в ручную". Как раз подвернулся один достаточно простой проект,хорошо подходяший для начального освоения работы с РТОС. Все достаточно быстро и без вопросов завелось(спасибо за примеры в комплекте оси) .
После этого решил перепилить на работу через РТОС старый проект на AVR+ ethernet (mac и физика на ENC28j60),компилятор IAR.И был очень удивлен удивлен увеличением времени отклика на ping c бывших 5-6ms
на суперлупе до 150ms на scmRTOS.
По моему в 20 с лишним раз замедление работы это перебор. Проект перепиливал без больших переделок.
Я понимаю.что скорее всего баг у меня, только вот в какую сторону рыть?

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

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

_Артём_
Цитата(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" забыто?
WHALE
Цитата(_Артём_ @ Mar 9 2013, 00:18) *
Давно такой ошибки не видел, лет 5 уже наверное.
Вызывается она скорей всего не типом процессора, а текстом программы - какой-то текст почему-то вдруг переклинивал компилятор. Потом оно пропадало (после энного числа перезагрузок-редактирований программы).
Попробуйте опять на ATMega324P проект переключить, может заработает?
И велика ли разница между ATMega324P и ATMega324? Возможно в вашем проекте расширения PA и P версий меги не используются. Тогда можно компилировать для ATMega324 и не парится.


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

Цитата(_Артём_ @ Mar 9 2013, 00:18) *
Может объявлено не правильно?
Или extern "C" забыто?


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

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


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

Странно, ни видел такого, чтобы проблемы были...
Покажте код класса.
WHALE
Цитата(_Артём_ @ 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 оставляет.
Шайтан...
_Артём_
Цитата(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?
Сергей Борщ
QUOTE (_Артём_ @ Mar 9 2013, 00:32) *
P.S. Странно что один вектор выкидывает, другой - нет.
P.S.2 В таблице векторов эти вектора у вас есть или там RETI?
Пусть автор сделает элементарный проект типа
CODE
void main()
{
     if(UART.hasinput())
           UART.send(UART.receive());
}
который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.
WHALE
Цитата(Сергей Борщ @ Mar 9 2013, 06:04) *
Пусть автор сделает элементарный проект типа
Код
void main()
{
     if(UART.hasinput())
           UART.send(UART.receive());
}
который компилится с такими же симптомами. В нем и обработчики могут быть пустыми, и эти три функции тоже. Лишь бы собиралось с теми же симптомами. Если же такой простой проект собирается нормально - постепенно наращивать его из проблемного исходника пока проблема не появится и уже тогда думать - что ее могло вызвать.


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

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

С уважением.
_Артём_
Цитата(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


WHALE
Цитата(_Артём_ @ 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 вектор присутствует.
Шайтан



_Артём_
Цитата(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 называлось, но где его генерация включалась я забыл...
WHALE
Цитата(_Артём_ @ Mar 10 2013, 00:48) *
В таблице присутсвует, при возникновении прерывания переходит на вектор, то есть работает.
С чего же следует что Иар его выбросил?


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

Цитата(_Артём_ @ Mar 10 2013, 00:48) *
Откуда вы это получили

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

да вроде это не Call graph.
Просто на вкладке ЛИНКЕР->List включил генерацию мап-файла и выбрал
под ним все три опции генерации отчета.
_Артём_
Цитата(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. То есть не понятно как при этом переключение задач произойдёт?
Опять наверное путаница из-за различия имён в разных мегах возникла...
WHALE
Цитата(_Артём_ @ Mar 10 2013, 01:55) *
Но это не значит что прерывание выкинуто. Возможно Ос своим присутствием блокирует прерывания.
Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть.
Может стеков не хватает или ещё что...


не-не не. у меня специально 2 фоновый процесс создан-там светик моргает,
значит задачи переключаются.
и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит.

Цитата(_Артём_ @ Mar 10 2013, 01:55) *
Запустил вашу программу в симуляторе - она всё время на OS::Start возвращается - значит какой-то глюк может быть.
Может стеков не хватает или ещё что...

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

Ладно,пора спать,утро вечера мудренее...
_Артём_
Цитата(WHALE @ Mar 10 2013, 00:20) *
не-не не. у меня специально 2 фоновый процесс создан-там светик моргает,
значит задачи переключаются.

Может и так, ведь проекты у нас не совсем одинаковые, так как версии Иара разные и не все файлы есть.
Эти строки из OS_Target_asm.s90
Цитата
#include "D:\Viktor\Проекты\микроконтроллеры\AVR-8\Progekts IAR\scm_rtos\snmp\soft\scm_rtos_Config\scmRTOS_CONFIG.h"
#include "D:\Viktor\Проекты\микроконтроллеры\AVR-8\Progekts IAR\scm_rtos\snmp\soft\scm_rtos_Config\scmRTOS_TARGET_CFG.h"

пришлось закоментировать, потому как у меня нет этих файлов...


Цитата(WHALE @ Mar 10 2013, 00:20) *
и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит.

8 секунд - не период ватчдога случайно?

Цитата(WHALE @ Mar 10 2013, 00:20) *
А симулятору ОС крышу сносит напрочь своим переключением стековых фреймов,это да.

Не замечал такого - чтобы сносило, но мало ли, может и так.
То есть у вас вектор номер 0x6C в таблице есть?

Цитата(WHALE @ Mar 10 2013, 00:20) *
Ладно,пора спать,утро вечера мудренее...

Тоже дело...
_Артём_
Цитата(WHALE @ Mar 10 2013, 00:20) *
не-не не. у меня специально 2 фоновый процесс создан-там светик моргает,
значит задачи переключаются.
и в порт раз в 8секунд вывод идет-но только 1 байт,а не 5- в прерывание не заходит.


Получается, что если в scmRTOS_CONFIG.h (для АВР)
Код
#define scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 0

, то в context_switch_hook не будет вызвана функция
Код
INLINE void block_context_switch() { SPM_CONTROL_REG &= ~(1 << SPMIE); } // disable SPM interrupt

и прерывание SPM будет происходить всегда и к тому же будут блокированы все вектора с номером большим, чем SPM.
То есть для АВР scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE должно быть равным 1, если используется переключение с помощью прерываний на векторе SPM. Тогда он не совсем user_hook - без него программа работать не будет?

В проекте WHALE прерывание USART1_TX не отрабатывается, потому что его приоритет ниже чем у прерывания SPM, которое не отключается после переключения контекста.
WHALE
Нет,Артем,все как всегда оказалось значительно проще.
РТОС вообще не причем.
на 3 сутки я обнаружил,что в камере нет одной стены упростил проект еще-убрал РТОС- и охренел,увидев что прерывание по концу передачи uart1 все-равно не работает.Стал восстанавливать порядок действий-доРТОС-ный вариант
у меня был собран на меге164.Но ОЗУ там было в обрез и при перепиливании на вариант с РТОС я перешел на 324.
И наткнувшись на этот баг решил,но виновата ОСЬ.
Сейчас проделал следующий эксперимент-достал плату с 164 мегой,сомпилировал под неё(не трогая кода)-все работает!!!
Компилю тот-же код под 324-не работает. wub.gif
Ставлю версию IAR 6.12.1 - работает все.
Вывод мой такой-что-то в версии 6.20 яровцы порушили для 324 меги.
се ля ви...
_Артём_
Цитата(WHALE @ Mar 12 2013, 13:01) *
Нет,Артем,все как всегда оказалось значительно проще.
РТОС вообще не причем.

Может и так.
Я запускал ваш проект в симуляторе, вроде работало правильно, но как он в железе поведёт - вопрос.


Цитата(WHALE @ Mar 12 2013, 13:01) *
И наткнувшись на этот баг решил,но виновата ОСЬ.

Думаю, что она и виновата. Вернее неправильная настройка ОСи.
Обратите внимание на значение макроса scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE. Мне кажется, если он будет равен 0, то работа системы сильно замедлится и частично может быть заблокирована. Или я неправ?

Цитата(WHALE @ Mar 12 2013, 13:01) *
Вывод мой такой-что-то в версии 6.20 яровцы порушили для 324 меги.
се ля ви...

На компиляторописателей думать - последнее дело, хотя всякое бывает...
WHALE
Цитата(_Артём_ @ Mar 12 2013, 15:48) *
Думаю, что она и виновата. Вернее неправильная настройка ОСи.
Обратите внимание на значение макроса scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE. Мне кажется, если он будет равен 0, то работа системы сильно замедлится и частично может быть заблокирована. Или я неправ?


На компиляторописателей думать - последнее дело, хотя всякое бывает...

Артем, еще раз.Я вчера выкинул из проекта ось и прерывание USART1_TX_vect все равно не
работало.Этот -же код скомпилированный этим-же компилятором с теми-же опциями
под мегу 164 работает.
В iar 6.12 этот-же код скомпилированный с теми-же опциями работает и на 324 тоже.
Да,в боевом проекте при попытке выбора меги324p iar выдавал внутреннюю ошибку.
имхо,виноват iar.
Romcik077
Здравствуйте!
Помогите новичку. У меня проблема с запуском scmRTOS. Работаю я в Eclpse с компилятором GCC-ARM. В чем состоит суть моей задачи используя библиотеку mbed(mbed) запустить scmRTOS на этом деваисе LPC1768 используя для компиляций Eclipse. Ниже загрузил проект, он компилируется даже запускается но виснет на первой задаче. Если заметите то в програме прописаны пересылки через UART, так вот на выходе я получяю "Hello\r\nS", и диоды не мигают, тут програма и виснет. Помогите разобраться пожалуйста. Укажите куда копать код.
Заранее спасибо за помощь!!!

Нажмите для просмотра прикрепленного файла
AHTOXA
Вы используете стартовый код от mbed: mbed/LPC1768/GCC_ARM/startup_LPC17xx.o. (Там что, нет исходников?).
В нём используемые осью прерывания называются
SysTick_Handler и PendSV_Handler.
А в оси они называются иначе:
SystemTimer_ISR и PendSVC_ISR.
Соответственно, надо либо найти исходник от startup_LPC17xx.o и переименовать там, либо править в исходниках оси.
Romcik077
Цитата(AHTOXA @ Apr 6 2013, 22:18) *
Вы используете стартовый код от mbed: mbed/LPC1768/GCC_ARM/startup_LPC17xx.o. (Там что, нет исходников?).
В нём используемые осью прерывания называются
SysTick_Handler и PendSV_Handler.
А в оси они называются иначе:
SystemTimer_ISR и PendSVC_ISR.
Соответственно, надо либо найти исходник от startup_LPC17xx.o и переименовать там, либо править в исходниках оси.

Спасибо за быстрый ответ.
К сожалению исходников LPC17xx.o нет, самому хотелось но нету. Так что пришлось менять исходники scmRTOS(ниже выложен измененый проект), изменил в трех файлах OS_Target_asm.S, scmRTOS_TARGET_CFG.h и OS_Target_cpp.cpp, но к сожалению это много не помогло. С помощью debugger-а проверил, прерывания пошли, но все равно виснет, вроде нашел точку блокировки но не знаю как исправить, останавливается он на коде: INLINE void disable_context_switch() { disable_interrupts(); }, в фаиле OS_Target.h, по краиней мере debugger зависает после этой строчки кода.
Нажмите для просмотра прикрепленного файла
Забыл спросить прерывания PendSV_Handler тоже должны происходить переодически? Потому-что во время debugging-а ни разу ни вызывалось это прерывание, может в этом проблема?
_Артём_
Цитата(Romcik077 @ Apr 6 2013, 23:21) *
исправить, останавливается он на коде: INLINE void disable_context_switch() { disable_interrupts(); }, в фаиле OS_Target.h, по краиней мере debugger зависает после этой строчки кода.

У вас там не зашищённый режим (thread mode)?

Цитата(Romcik077 @ Apr 6 2013, 23:21) *
Забыл спросить прерывания PendSV_Handler тоже должны происходить переодически?

Это прерывание возникает когда нужно передать управление другой задаче. Если оно у вас не происходит, то возможно раньше ошибка где-нибудь произошла.


Romcik077
Цитата
У вас там не зашищённый режим (thread mode)?

Вы имеете в виду что не разрешается выполнение кода ассемблера? Вроде нет функция os_start из OS_Target_asm.S нормально проходит.
_Артём_
Цитата(Romcik077 @ Apr 7 2013, 01:01) *
Вы имеете в виду что не разрешается выполнение кода ассемблера? Вроде нет функция os_start из OS_Target_asm.S нормально проходит.

Наверное моё предположение о thread-режиме неправильное.

disable_context_switch вызывается вроде только в функции TKernel::sched. То есть туда попадает? У вас HardFault не возникает какой-нибудь? Вы можете заменить их обработчик на свой и посмотреть адрес где возникает ошибка?

P.S. Интересно просто...зачем он - mbed, если он без исходников.
Что делать в случае ошибки в либе? Можно заменить своей? Какие ресурсы процессора либа использует и как(DMA и тд)? Можно ли заменить их реализацию своей?
Romcik077
Я решил заменить стартовые и системные библиотеки на те что даны в примере для LPC17xx. Помогите чтоб не ошибится что нужно заменить для компиляций. Вроде как startup_LPC17xx.o -> startup.c, system_LPC17xx.o -> sysinit.cpp и все это скомпилировать. Нужны еще какие-то зависимости?
AHTOXA
Вроде бы больше ничего не нужно. Проверьте только, что остальные имена обработчиков прерываний совпадают с mbed-овскими. (Думаю, что он использует какие-то прерывания).
Romcik077
Идея с заменой системного и запускного обработчика не особо получилась там есть завизимости библиотеки и пришлось-бы переписать ее. Помогите может изменить немного и запустится может.
Цитата(_Артём_ @ Apr 7 2013, 01:52) *
disable_context_switch вызывается вроде только в функции TKernel::sched. То есть туда попадает? У вас HardFault не возникает какой-нибудь? Вы можете заменить их обработчик на свой и посмотреть адрес где возникает ошибка?

Вы оказались правы он в функций TKernel::sched и зависает а иммено в цикле
Код
do
{
     enable_context_switch();
     DUMMY_INSTR();
     disable_context_switch();
}
while(CurProcPriority != SchedProcPriority);

Я так понимаю просто не происходит прерывание PendSV_Handler которая переключит контексты, потому-что ни разу за выполнение програмы меня не кидало туда. Что мне делать помогите пожалуйста?
А обработчик где заменить? В ассемблеревском коде или TKernel::sched.
Как проверить возникновение HardFault?
Romcik077
Всем спасибо за помощь!!! Проблема совсем в другом оказалась. Ну не совсем проблема... Оказывалось что програма заработала после смены SystemTimer_ISR и PendSVC_ISR на нужные, но из за функций sleep(), которому я задал слишком малый параметр и мне казалось что диоды не мигают. После смены SYSTICKINTRATE с 960 на 96 я заметил что диоды замигали и тут я понял в чем проблема. Что-ж осталось разобраться в чем измеряется параметр для sleep() и какие значения поставить для SYSTICKINTRATE и SYSTICKFREQ(теперь они 96 и 96000000). Если не трудно подскажите как правильно подобрать?
Еще раз спасибо за помощь и за такую простую и удобную ОСь.
AHTOXA
SYSTICKFREQ - это частота тактирования системного таймера.
А SYSTICKINTRATE - это желаемая частота прерываний системного таймера. В герцах.
Аргумент функции sleep() - число тиков системного таймера.
То есть, скажем, если SYSTICKINTRATE = 1000, то аргумент sleep() будет в миллисекундах, и для того, чтобы проспать секунду, надо написать sleep(1000);.
AlexG
При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes

Ругань компилятора вызывает контсруктор шаблонного класса TProfiler:

Код
template < uint_fast8_t sum_shift_bits >
TProfiler<sum_shift_bits>::TProfiler()
    : Counter (   )
    , Result  (   )
{
}


а именно
Код
    : Counter (   )
    , Result  (   )


Не сталкивался раньше с подобным, это баг компилятора или в коде профайлера scmRTOS что-то не учтено?

Сергей Борщ
Поскольку в исходниках ОС нет явного вызова __near_memzero, значит его вызывает сам компилятор и значит да - это бага компилятора.
dxp
QUOTE (ex_AlexG @ Sep 17 2013, 16:19) *
При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes

По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется.
AlexG
Цитата(dxp @ Sep 17 2013, 20:40) *
По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется.


Чтобы исключить влияние каких-то неучтенных настроек создал проект заново, получил то-же самое сообщение об ошибке, но более развернутое:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes
/* In module debug: */
/* Function, args 2, attr 0 */
void (__version_3 __near_memzero)(void volatile *, unsigned int);
/* In module ?xxmemxmemzero: */
/* Function, args 2, attr 0 */
void (__version_3 __near_memzero)(void *, __near_size_t);
typedef unsigned int __near_size_t;

Прикладываю проект (в составе порта)
Нажмите для просмотра прикрепленного файла
сарматъ
понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах


цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты
AlexG
Цитата(сарматъ @ Sep 19 2013, 18:14) *
понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах

цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты


Зачем мне ARM? У меня и на Xmega все работает sm.gif Включая scmRTOS.

Периферия у Xmega мне нравится на порядок больше чем у STM32F1, особенно система событий позволяющая кучу работы сделать аппаратно без участия программы и встроенный EEPROM.
Внутрисхемная отладка и у AVR есть, без нее приходится отлаживать программы только для старья вроде ATmega8 и ATtiny15.
Свободные средства разработки тоже есть, не так как у STM8.
WHALE
Есть несколько вопросов по scmRTOS под АРМ.

1.Вопрос по приоритетам.
При работе с АВР приоритеты без вариантов рулятся только на уровне оси.
А вот как быть с АРМ-ами?
Пока в голову приходит следующее:
Выставить всем осевым прерываниям одинаковый приоритет в контроллере прерываний,
чуть выше системного таймера.
А какой приоритет в контроллере прерываний ставить внеосевым прерываниям?

2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет.
Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4.
Какое будет актульнее для 3-й?

3.Столкнувшись с глюками под отладчиком,к своему удивлению не обнаружил в версии 3.хх
поддержки режима отладки .Бегло глянул версию 4.0 под GCC и там не увидел тоже.
А без нее реально под jtag-ом глючит-периодически улетает неведомо куда и сваливается в исключения.
Я добавил в __low_level_init()
#ifdef DEBUG
AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Enable Debug mode
#endif
и в cstartup.s
Код
resetVector:
        LDR     pc, =resetHandler       ; Reset                                
        LDR     pc, Undefined_Addr     ; Undefined instructions            
        LDR     pc, SWI_Addr            ; Software interrupt (SWI/SYS)        
        LDR     pc, Prefetch_Addr      ; Prefetch abort                      
        LDR     pc, Abort_Addr          ; Data abort                          
        B       .                              ; RESERVED            
        #ifdef DEBUG
       LDR     pc, =irqHandler    
        #else    
        LDR     PC,[PC,#-0x20]         ;                            
        LDR     pc, FIQ_Addr             ; FIQ


irqHandler:
        STMFD   SP!, {r5,r6,r7}         ;
        LDR     r5, =AT91C_BASE_AIC ;
        LDR     r6, [r5, #AIC_IVR]      ;  
        STR     r5, [r5, #AIC_IVR]      ;Write in the IVR to support Protect Mode
        STR     r6, [SP, #8]               ;
        LDMFD  SP!, {r5,r6,PC}

ну и в scmRTOS_config.h если нужна отладка определить #define DEBUG

С уважением.


mdmitry
Цитата(WHALE @ Dec 9 2013, 14:33) *
2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет.
Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4.
Какое будет актульнее для 3-й?

А в trunk лежит не то, что Вам нужно? Порт только для GCC. Для отладки в 4.0 пример Debug с применением Extensions.
WHALE
Цитата(mdmitry @ Dec 9 2013, 15:17) *
А в trunk лежит не то, что вам нужно? Порт только для GCC.


Я прикидывал затраты на перепиливание существующей версии 3.11 под текущий iar и портирование под IAR GCC-ный порт 4.0.
С учетом моего нулевого опыта с АРМ-ами первый вариант мне показался проще.
Но сейчас проблема не в порте,а в подходе к написанию кода.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.