Waso 1 June 20, 2008 Posted June 20, 2008 · Report post Скажите, а у вас стек ниспадающий чтоле? 0_о Заполнил константой - смотрю - он от начала ею заполнен и только в конце появляются какието данные. Почему так решили сделать? Локализовать это определение в одно место вместо двух (ассемблер, компилятор)Там получается не два места, а по два на каждую конфигурацию (RAM, Flash и тп)... Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 169 June 20, 2008 Posted June 20, 2008 · Report post Скажите, а у вас стек ниспадающий чтоле???? Это не у нас, это в архитектуре ARM так сделано. См. описание команд push и pop в THUMB режиме. Quote Share this post Link to post Share on other sites More sharing options...
Waso 1 June 20, 2008 Posted June 20, 2008 · Report post Ясно. Незнал, простите. Вобщем теперь реализация такая: 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: Выражаю благодарность авторам за сей продукт. Действительно легкая и красивая операционка! Quote Share this post Link to post Share on other sites More sharing options...
Waso 1 June 23, 2008 Posted June 23, 2008 · Report post После ручного сброса или сьема/подачи питания перестает работать шедулер. Циклится здесь: do { EnableContextSwitch(); DUMMY_INSTR(); DisableContextSwitch(); } while(!IsContextSwitchDone()); Как исправить? Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 169 June 23, 2008 Posted June 23, 2008 · Report post После ручного сброса или сьема/подачи питания перестает работать шедулер.И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается. После ручного сброса или сьема/подачи питания перестает работать шедулер.И после передергивания питания тоже? Обычно прерывания перестают вызываться после сброса в отладчике - поскольку сброс в отладчике сбрасывает только ядро но не контроллер прерываний. В .mac сделан сброс всей периферии. Если вы используете другой .mac - то вполне возможно, что контроллер прерываний не сбрасывается. Quote Share this post Link to post Share on other sites More sharing options...
Waso 1 June 23, 2008 Posted June 23, 2008 · Report post Дописал в инициализацию AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS); Все ок. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 169 June 28, 2008 Posted June 28, 2008 · Report post Дописал в инициализацию 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) также отсутствует. Значит дело было в чем-то другом. Ищите. "Призовая игра!" ;) Quote Share this post Link to post Share on other sites More sharing options...