Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...