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