Jump to content
    

scmRTOS. Порт под AT91SAM7X

Скажите, а у вас стек ниспадающий чтоле? 0_о Заполнил константой - смотрю - он от начала ею заполнен и только в конце появляются какието данные. Почему так решили сделать?

Локализовать это определение в одно место вместо двух (ассемблер, компилятор)
Там получается не два места, а по два на каждую конфигурацию (RAM, Flash и тп)...

Share this post


Link to post
Share on other sites

Скажите, а у вас стек ниспадающий чтоле?
??? Это не у нас, это в архитектуре ARM так сделано. См. описание команд push и pop в THUMB режиме.

Share this post


Link to post
Share on other sites

Ясно. Незнал, простите. Вобщем теперь реализация такая:

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

}

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);

}

#define STACK_FILL_CONST 0xFFF7FFFF

#define DEDUG_STACK

ну и добавлена константа const word StackSize; в описание класса TBaseProcess.

Из корыстно-альтруистических соображений хочу попросить включить это или нечто подобное в последующие версии, чтоп самому не править после каждого обновления, да и людям, уверен, пригодится. :rolleyes:

 

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

Share this post


Link to post
Share on other sites

После ручного сброса или сьема/подачи питания перестает работать шедулер. Циклится здесь:

        do
         {
             EnableContextSwitch();
             DUMMY_INSTR();
             DisableContextSwitch();
         } 
         while(!IsContextSwitchDone());

Как исправить?

Share this post


Link to post
Share on other sites

После ручного сброса или сьема/подачи питания перестает работать шедулер.
И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается.

 

 

После ручного сброса или сьема/подачи питания перестает работать шедулер.
И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается.

Share this post


Link to post
Share on other sites

Дописал в инициализацию

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) также отсутствует. Значит дело было в чем-то другом. Ищите. "Призовая игра!" ;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...