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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> scmRTOS + XMEGA, порт scmRTOS для XMEGA
Сергей Борщ
сообщение Feb 9 2011, 09:35
Сообщение #16


Гуру
******

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



QUOTE (quarter2 @ Feb 9 2011, 11:00) *
Есть ни что иное, как запрещение прерываний на время окончания записи в ЕЕПРОМ
Внимательно читайте даташит и включайте голову. Это запрещение прерываний на две команды запуска процесса записи, 4 такта.
QUOTE (quarter2 @ Feb 9 2011, 11:00) *
В IAR EWAVR 5.50 в файле eeprom.s90 нет запрещений прерываний на время ожидания окончания записи в ЕЕПРОМ
В IAR EWAVR 5.50 есть ключевое слово __eeprom. eeprom.s90 пора забыть еще в версии 1.26. Ждать окончания записи можно и с разрешенными прерываниями.


--------------------
На любой вопрос даю любой ответ
"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
quarter2
сообщение Feb 9 2011, 10:03
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594



Цитата(Сергей Борщ @ Feb 9 2011, 11:35) *
Внимательно читайте даташит и включайте голову. Это запрещение прерываний на две команды запуска процесса записи, 4 такта.

Про пример из даташита - согласен. В примере как раз прерывания отключаются на время запуска процесса записи в ЕЕПРОМ.
Но в файле eeprom.s90 как раз прерывания отключаются на время окончания записи в ЕЕПРОМ:
;----------------------------------------------------------
; ?eewait
;
; Wait for previous eeprom write operation to complete
;
; SIZE: 6 bytes

RSEG CODE:CODE:NOROOT(1)
?eewait:
CLI
SBIS EECR,EEWE ; Loop until previous write is completed
RET
OUT SREG,T0
RJMP ?eewait

Цитата(Сергей Борщ @ Feb 9 2011, 11:35) *
В IAR EWAVR 5.50 есть ключевое слово __eeprom. eeprom.s90 пора забыть еще в версии 1.26.

Неправильно. Все переменные, которые объявлены ключевым словом __eeprom при компиляции для работы с областью памяти ЕЕПРОМ используют файл
eeprom.s90
Цитата(Сергей Борщ @ Feb 9 2011, 11:35) *
Ждать окончания записи можно и с разрешенными прерываниями.

Если бы не наступал на эти грабли - не поднимал бы вопрос. Без запрещения прерываний на время окончания записи есть вероятность некорректной записи данных в область ЕЕПРОМ

Сообщение отредактировал quarter2 - Feb 9 2011, 10:07
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2011, 11:14
Сообщение #18


Гуру
******

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



QUOTE (quarter2 @ Feb 9 2011, 12:03) *
Неправильно. Все переменные, которые объявлены ключевым словом __eeprom при компиляции для работы с областью памяти ЕЕПРОМ используют файл
eeprom.s90
Не совсем так - они используют функции из библиотеки. Возможно, источником при компиляции библиотеки является этот самый eeprom.s90. Если вы добавите этот файл в проект, то его функции заменять одноименные библиотечные. Давно не пользуюсь ИАРом для AVR, не могу посмотреть что он там берет из библиотеки. Посмотрел старый проект - использовался компилятор версии 2.28, прерывания мною не запрещались, прерывания шли довольно активно, сбоев при записи не было.
QUOTE (quarter2 @ Feb 9 2011, 12:03) *
Без запрещения прерываний на время окончания записи есть вероятность некорректной записи данных в область ЕЕПРОМ
Прерывания тут не при чем - никогда не держу прерывания запрещенными во время записи и ни разу не нарывался на некорректную запись. Возможно вы используете (хотя бы и на чтение) __eprom-переменные в прерываниях, в этом случае - да, будут проблемы. Но это уже не проблема прерываний, а неверное архитектурное решение.


--------------------
На любой вопрос даю любой ответ
"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
quarter2
сообщение Feb 9 2011, 11:47
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594



Цитата(Сергей Борщ @ Feb 9 2011, 13:14) *
Не совсем так - они используют функции из библиотеки. Возможно, источником при компиляции библиотеки является этот самый eeprom.s90. Если вы добавите этот файл в проект, то его функции заменять одноименные библиотечные.

На IAR EWAVR только что откомпилил простенькую программку с записью в ЕЕПРОМ, при это файл eeprom.s90 в проект не включал. В дебаг-режиме увидел, что линкер точно подставляет в выходной код строки из C:\Program Files\IAR Systems\Embedded Workbench 5.5\avr\src\lib\eeprom.s90
Цитата(Сергей Борщ @ Feb 9 2011, 13:14) *
Возможно вы используете (хотя бы и на чтение) __eprom-переменные в прерываниях, в этом случае - да, будут проблемы. Но это уже не проблема прерываний, а неверное архитектурное решение.

Нет, в прерываниях __eprom-переменные не использую. При этом ЕЕПРОМ случайным образом, то пишется правильно, то с ошибками. Если включаю в проект файл eeprom.s90, в котором отключаются прерывания - данные в ЕЕПРОМ пишутся абсолютно правильно.
Go to the top of the page
 
+Quote Post
SWD
сообщение Feb 28 2011, 07:48
Сообщение #20





Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862



Здравствуйте.
scmRTOS работает на ATxmega128A1 (спасибо ReAl за подсказки).
Пока в контексте сохраняются не все RAMP регистры (пока не нужны).
Возникли трудности с многоуровневым контроллером прерываний. Критические секции вставил и в SYS_TIMER_CRIT_SECT() и в обёртки TISRW/TISRW_SS. Уровни всех прерываний установлены LO, при установке уровня прерывания системного таймера MED через пару секунд все перестает работать.
У кого какие мысли по этому поводу?, как заставить ОСь работать с различными уровнями прерываний?
Go to the top of the page
 
+Quote Post
SWD
сообщение Mar 1 2011, 07:37
Сообщение #21





Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862



Добавил сохранение в контекст RAMPD и RAMPX.
Проблему прерываний решил установкой уровня программного прерывания "HI".
Возможно, есть и другие решения …, предположительно два … )
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 1 2011, 08:16
Сообщение #22


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(SWD @ Feb 28 2011, 09:48) *
Возникли трудности с многоуровневым контроллером прерываний. Критические секции вставил и в SYS_TIMER_CRIT_SECT() и в обёртки TISRW/TISRW_SS. Уровни всех прерываний установлены LO, при установке уровня прерывания системного таймера MED через пару секунд все перестает работать.
У кого какие мысли по этому поводу?, как заставить ОСь работать с различными уровнями прерываний?
Надеюсь, доберусь до этого где-то в середине марта.
Раньше никак, хотя всё думал «ну вот в ближайшие выходные».


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
quarter2
сообщение Apr 22 2011, 13:55
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594



Вопрос к разработчикам scmRTOS:
1. почему исходники не содержат __watchdog_reset() хотя бы через #define ?
каждый раз после апдейта приходится практически во всех файлах после while и for вставлять __watchdog_reset()
2. было бы неплохо внести дополнения в описание класса process:
template<TPriority pr, size_t stack_size, size_t rstack_size>
class process : public TBaseProcess
{
public:
INLINE_PROCESS_CTOR process();

int StackFree() {
word Free = 0;
for(;;) { // stack always has non-0xAB items.
if( Stack[Free] != 0xAB )
return Free;
++Free;
}
}

int StackUsed() { return stack_size - StackFree(); }

OS_PROCESS static void exec();

private:
stack_item_t Stack [stack_size/sizeof(stack_item_t)];
stack_item_t RStack[rstack_size/sizeof(stack_item_t)];
};

template<TPriority pr, uint16_t stack_size, uint16_t rstack_size>
process<pr, stack_size, rstack_size>::process() : TBaseProcess( &Stack[stack_size/sizeof(stack_item_t)]
, &RStack[rstack_size/sizeof(stack_item_t)]
, pr
, reinterpret_cast<void (*)()>(exec)
#if scmRTOS_DEBUG_ENABLE == 1
, Stack
, RStack
#endif
)
{
stack_item_t *pDst = Stack;
word Size = StackPointer - Stack;
while(Size)
{
*pDst++ = 0xAB;
--Size;
}
}

т.к. StackUsed() и StackFree() очень сильно помогают при отладке
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 22 2011, 19:06
Сообщение #24


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(quarter2 @ Apr 22 2011, 16:55) *
1. почему исходники не содержат __watchdog_reset() хотя бы через #define ?
каждый раз после апдейта приходится практически во всех файлах после while и for вставлять __watchdog_reset()

1. Назачем нужен WDT, который тупо сбрасывается во всех цилах?
2. Где в потрохах scmRTOS есть циклы, в которых управление задерживается на время, критичное с точки зрения успевания сбросить WDT ?

Цитата(quarter2 @ Apr 22 2011, 16:55) *
2. было бы неплохо внести дополнения в описание класса process:
Контроль стеков и профилировщик добавлены в ветке репозитория branches/pre-v400, которая в скором времени превратится в scmRTOS v4.00


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 16 2012, 23:57
Сообщение #25


Гуру
******

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



Здраствуйте.
Попробовал недавно scmRTOS - понравилось, но толку...для xmeg поддержки нет, а хотелось бы.
Появилось желание перенести версию 3.10 на хмегу. Но возникло столько вопросов и непонятных
моментов, что кажется хотелки так хотелками и остануться...
Попытаюсь здесь изложить моменты которые, как мне кажется нужно поменять в версии и
вызывающие у меня сомнения.
хотелось бы увидеть критику/советы как сделать лучше/как делать не надо, тд и тп.

Общие для разных схем переключения контекста моменты.
1. Функции SetDataSP/GetDataSP:

Заменить на (для начала сгодится, хотя лишний call/ret, но как лучше не нашёл):
Код
GetDataSP:
    mov        R16, R28
    mov        R17, R29
    ret
SetDataSP:
    mov        R29,R17
    mov        R28,R16
    ret


и соотв.

Код
extern "C" {
    TStackItem* GetDataSP();
};

extern "C" {
    void SetDataSP(TStackItem* sp);
};


2. Добавить в контекст RAMP_XYD. С этим понятно.
3. Были тут высказаны идеи о включении в контекст
регистра разрешённых прерываний, но мне кажется что это необязательно.
Или нет?

I. Схема переключения контекста по прерыванию.

1. Добавить запрет прерыванию после перехода на вектор ContextSwitcher_ISR,
но пока не понял куда именно добавить чтоб и наверняка и критическая секция
была как можно короче?

Код
     save_SREG
     cli; запрет прерываний
     save_SP
     save_regs
     save_SFRS
    
;cli; запрет прерываний или здесь правильней?
     mov   r16,r28                    ; load current stack pointer
     mov   r17,r29
                            ; as argument
    
     xcall OS_ContextSwitchHook          ;
     mov   r28,r16                    ; set next stack pointer
     mov   r29,r17                    ; from return value


2. Ещё совершенно непонятный для меня момент: каким уровнем лучше расположить
ContextSwitcher_ISR? Или не это непринципиально, а атомарность переключения?

С этой схемой как бы всё. Или нет? Тогда что я упустил?

II. Схема с прямой передачей управления.

1. Прерывания с TISRW_SS

Если я правильно понял, то в мегах выход из прерывания при переключении
реализуется таким путём:

Код
переход на вектор прерывания->
функция прерывания->
вариант 1: перепланировка не нужна->reti
вариант 2: перепланировка нужна->OS_ContextSwitcher->ret


Если использовать прерывания, использующие сервисы ОС, только одного уровня,
то можно так:

Код
OS_ContextSwitcher:

     save_SREG
     save_SP
     save_regs
     save_SFRS


     mov  r30,r16; Curr_SP_addr
     mov  r31,r17;
     std  Z+0,r28; save process's Stack Pointer
     std  Z+1,r29;
    

    

     mov  r28,r18; load next process Stack Pointer
     mov  r29,r19;
    
     lds  R16, 0x00A0; PMIC.STATUS
     andi R16, 7
     BRNE Int_RestoreContext    
      
L_RestoreContext:

      
     restore_SFRS
     restore_regs
     restore_SP
     restore_SREG

     ret
    
Int_RestoreContext:
     restore_SFRS
     restore_regs
     restore_SP
     restore_SREG

     reti


Но решение какое-то ограниченное...
Попробовал изменить TISRW_SS
CODE

class TISRW_SS
{
public:

INLINE TISRW_SS(byte int_level) {
#if scmRTOS_CONTEXT_SWITCH_SCHEME==0
CurrentInterruptLevelMask=~int_level;
CurrentInterruptLevelMask&=scmRTOS_INTERRUPT_LEVEL_MASK;
#endif
ISR_Enter();
}

INLINE ~TISRW_SS() { ISR_Exit(); }

private:
#if scmRTOS_CONTEXT_SWITCH_SCHEME==0
byte CurrentInterruptLevelMask;
#endif
//-----------------------------------------------------
INLINE void ISR_Enter() // volatile
{
TCritSect cs;
if(Kernel.ISR_NestCount++ == 0)
{
SavedSP.DataSP = GetDataSP();
SavedSP.ReturnSP = GetReturnSP();
SetISRStackPointers();
}

#if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
DisableContextSwitch();
#endif
}
//-----------------------------------------------------
INLINE void ISR_Exit()
{
TCritSect cs;
if (--Kernel.ISR_NestCount==0) {
SetReturnSP(SavedSP.ReturnSP);
SetDataSP (SavedSP.DataSP);
}
#if scmRTOS_CONTEXT_SWITCH_SCHEME==0
if (PMIC.STATUS&CurrentInterruptLevelMask) return ;
#endif
Kernel.SchedISR();
}
//-----------------------------------------------------
};


Но тоже какая-та ерунда: теперь получается что все прерывания
одного уровня должны либо использовать, либо не использовать TISRW_SS.
В общем тоже костыль получился, хотя и выглядит работающим (см. приложение).

В связи с этой проблемой вопрос: можно ли заставить IAR сделать функию
прерывания ещё и __monitor (возможно ли это в хмегах вообще - запретить прерывание более
высокого уровня след. командой после перехода с вектора прерывания и будет ли этот
запрет отрабатываться)? Этот вариант завтра попробую.

Спасибо.
Прикрепленный файл  xm.rar ( 539.45 килобайт ) Кол-во скачиваний: 115
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 12 2012, 11:48
Сообщение #26


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ой-ой-ой... Мне самому xmega до сих пор как-то не нужна, вот я и тяну.
В очередной раз достал наверх макетку с atxmega128a1, помигал светодиодом, буду искать время на scmRTOS на ней.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 12 2012, 14:59
Сообщение #27


Гуру
******

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



Цитата(ReAl @ Feb 12 2012, 13:48) *
Ой-ой-ой...

Это вы о чём?
По поводу моей писанины или вообще?

Цитата(ReAl @ Feb 12 2012, 13:48) *
Мне самому xmega до сих пор как-то не нужна, вот я и тяну.

Это понятно.
STM8 лучше xmeg-и?

Цитата(ReAl @ Feb 12 2012, 13:48) *
В очередной раз достал наверх макетку с atxmega128a1, помигал светодиодом, буду искать время на scmRTOS на ней.

Ждём.
Go to the top of the page
 
+Quote Post
a9d
сообщение Feb 12 2012, 15:52
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Стмка на порядок дешевле. И там есть свои вкусности. Например можно подгружать с внешней памяти функции в оперативку и выполнять их.
Но у них есть большой минус связанный с ихним трехуровневым конвейером. Из за него нельзя делать софтварные задержки и будут проблемы с софтварным 1-wire.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 12 2012, 16:25
Сообщение #29


Гуру
******

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



Цитата(a9d @ Feb 12 2012, 17:52) *
Стмка на порядок дешевле.

Реально на порядок? Посмотрю.

Цитата(a9d @ Feb 12 2012, 17:52) *
Например можно подгружать с внешней памяти функции в оперативку и выполнять их.

Жаль в АВР такого нет. Полезная возможность.

Цитата(a9d @ Feb 12 2012, 17:52) *
Но у них есть большой минус связанный с ихним трехуровневым конвейером. Из за него нельзя делать софтварные задержки и будут проблемы с софтварным 1-wire.

Зачем программно? Аппаратные ресурсы надо задействовать.
Go to the top of the page
 
+Quote Post
a9d
сообщение Feb 12 2012, 17:04
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



stm8 настолько дешевые, что стоят почти как stm32. И тут стоит вопрос нахрена их брать?
В ST конечно умные дядьки сидят и они выпустили ультра дешевые stm8 с менее прочной флешпамять(100 гарантированных циклов записи), но полностью совместимый с полноценными микроконтроллерами. Т.е. проект разрабатываешь на нормальном камне а в серию идут дешевые мк.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 12:05
Рейтинг@Mail.ru


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