Цитата(bek @ Mar 2 2011, 13:31)

Интересно, что получится, если заменить конструкцию
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save(); \
OS_CPU_IntDisMeasStart();}
#define OS_EXIT_CRITICAL() {OS_CPU_IntDisMeasStop(); \
OS_CPU_SR_Restore(cpu_sr);}
на
#define OS_ENTER_CRITICAL() {cpu_sr = OSSchedLock(); \
OS_CPU_IntDisMeasStart();}
#define OS_EXIT_CRITICAL() {OS_CPU_IntDisMeasStop(); \
OSSchedUnlock(cpu_sr);}
Я, конечно, еще только начинаю с uCOS-ом работать, но, по-ходу, в этом случае заведомо планировщик никогда работать не будет, потоки переключаться ни будут:
OSSchedLock инкрементирует переменную OSLockNesting. А теперь если посмотреть функцию OS_Sched(), то там сначала вызывается OS_ENTER_CRITICAL(), а потом проверяется OSLockNesting, и если она равна нулю, то выполняется планирование. То есть OSLockNesting нулю никогда равна не будет, и функция OS_Sched() просто завершит свою работу.
Цитата(VslavX @ Mar 2 2011, 14:33)

Вот Вам более быстрый инлайновый вариант (под GCC), делает то же самое
Спасибо, надо будет так и сделать, быстрее работать будет. Только, может, для единообразия сделать обе функции или оба макроса. Хотя это и не принципиально.
И вообще, в PowerPC через инструкции типа rlwin удобно очень с масками работать. Вот как, кстати, в том же eCos-е прерывания разрешаются/запрещаются:
Код
#define HAL_DISABLE_INTERRUPTS(_old_) \
CYG_MACRO_START \
cyg_uint32 tmp1, tmp2; \
asm volatile ( \
"mfmsr %0; \n \
mr %2,%0; \n \
li %1,0; \n \
rlwimi %2,%1,0,16,16; \n \
mtmsr %2; " \
: "=r"(_old_), "=r" (tmp1), "=r" (tmp2)); \
CYG_MACRO_END
#define HAL_ENABLE_INTERRUPTS() \
CYG_MACRO_START \
cyg_uint32 tmp1, tmp2; \
asm volatile ( \
"mfmsr %0; \n \
ori %1,%1,0x8000; \n \
rlwimi %0,%1,0,16,16; \n \
mtmsr %0;" \
: "=r" (tmp1), "=r" (tmp2)); \
CYG_MACRO_END
где
Код
#define CYG_MACRO_START do {
#define CYG_MACRO_END } while (0)