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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> scmRTOS. Порт под AT91SAM7X, у кого есть уже отлаженный?
Waso
сообщение Jun 20 2008, 08:28
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Скажите, а у вас стек ниспадающий чтоле? 0_о Заполнил константой - смотрю - он от начала ею заполнен и только в конце появляются какието данные. Почему так решили сделать?
Цитата
Локализовать это определение в одно место вместо двух (ассемблер, компилятор)
Там получается не два места, а по два на каждую конфигурацию (RAM, Flash и тп)...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2008, 09:02
Сообщение #17


Гуру
******

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



Цитата(Waso @ Jun 20 2008, 11:28) *
Скажите, а у вас стек ниспадающий чтоле?
??? Это не у нас, это в архитектуре ARM так сделано. См. описание команд push и pop в THUMB режиме.


--------------------
На любой вопрос даю любой ответ
"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
Waso
сообщение Jun 20 2008, 09:32
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Ясно. Незнал, простите. Вобщем теперь реализация такая:
Цитата("OS_Target_cpp.cpp")
TBaseProcess::TBaseProcess(TStackItem* Stack, word Stack_Size, TPriority pr, void (*exec)())
: StackPointer(Stack), StackSize(Stack_Size), Priority(pr) , Timeout(0)
{
Kernel.RegisterProcess(this);

#ifdef DEDUG_STACK
//---------------------------------------------------------------
// Fill Stack area with some value to be able later to define stack usage
for (StackPointer-=(StackSize/sizeof(TStackItem)); StackPointer < Stack; *(StackPointer++) = STACK_FILL_CONST);
#endif //DEBUG_STACK

//---------------------------------------------------------------
// Prepare Process Stack Frame

*(--StackPointer) = (dword)exec; // return from interrupt address

StackPointer -= 14; // emulate "push R0-R12, LR"
#if __CPU_MODE__ == 1
*(--StackPointer) = 0x003F; // SR value: system mode, FIQ & IRQ enabled, THUMB
#else
*(--StackPointer) = 0x001F; // SR value: system mode, FIQ & IRQ enabled, ARM
#endif
}
Цитата("OS_Kernel.h")
template<TPriority pr, word stack_size>
class process : public TBaseProcess
{
public:
INLINE process():TBaseProcess(&Stack[stack_size/sizeof(TStackItem)], stack_size, pr, (void (*)())Exec){}
#ifdef DEDUG_STACK
word Used_Stack_Size();
#endif //DEDUG_STACK

OS_PROCESS static void Exec();

private:
TStackItem Stack[stack_size/sizeof(TStackItem)];
};

template<TPriority pr, word stack_size>
word process<pr,stack_size>::Used_Stack_Size()
{
TStackItem* Idx = Stack;
while(*(Idx++) == STACK_FILL_CONST);
return ((Stack + (StackSize/sizeof(TStackItem))) - Idx)*sizeof(TStackItem);
}
Цитата("commdefs.h")
#define STACK_FILL_CONST 0xFFF7FFFF
#define DEDUG_STACK
ну и добавлена константа const word StackSize; в описание класса TBaseProcess.
Из корыстно-альтруистических соображений хочу попросить включить это или нечто подобное в последующие версии, чтоп самому не править после каждого обновления, да и людям, уверен, пригодится. rolleyes.gif

Выражаю благодарность авторам за сей продукт. Действительно легкая и красивая операционка!
Go to the top of the page
 
+Quote Post
Waso
сообщение Jun 23 2008, 08:43
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



После ручного сброса или сьема/подачи питания перестает работать шедулер. Циклится здесь:
Код
        do
         {
             EnableContextSwitch();
             DUMMY_INSTR();
             DisableContextSwitch();
         }
         while(!IsContextSwitchDone());
Как исправить?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 23 2008, 09:52
Сообщение #20


Гуру
******

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



Цитата(Waso @ Jun 23 2008, 11:43) *
После ручного сброса или сьема/подачи питания перестает работать шедулер.
И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается.


Цитата(Waso @ Jun 23 2008, 11:43) *
После ручного сброса или сьема/подачи питания перестает работать шедулер.
И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается.


--------------------
На любой вопрос даю любой ответ
"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
Waso
сообщение Jun 23 2008, 11:14
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Дописал в инициализацию
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS);
Все ок.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 28 2008, 12:51
Сообщение #22


Гуру
******

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



Цитата(Waso @ Jun 23 2008, 14:14) *
Дописал в инициализацию
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS);
Все ок.
Хм.
SAM7S, SAM7SE:
Цитата
Note: 1. Setting SYSIRQ and ADC bits in the clock set/clear registers of the PMC has no effect. The System Controller is continuously clocked. The ADC clock is automatically started for the first conversion. In Sleep Mode the ADC clock is automatically stopped after each conversion.
SAM7X:
Цитата
Note: 1. Setting SYSC and ADC bits in the clock set/clear registers of the PMC has no effect. The System Controller and ADC are continuously clocked.
В описании PMC_PCER бит (1 << AT91C_ID_SYS) также отсутствует. Значит дело было в чем-то другом. Ищите. "Призовая игра!" wink.gif


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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