Johnny81 0 8 марта, 2013 Опубликовано 8 марта, 2013 · Жалоба Как я понял доку, тут должен сохраняться uxCriticalNesting. Собственно и в комментарии об этом написано. Но я что-то ссылок на uxCriticalNesting не вижу. Я плохо разбираюсь в ассемблере, не подскажете как это организовано? 313 void xPortPendSVHandler( void ) 314 { 315 /* This is a naked function. */ 316 317 __asm volatile 318 ( 319 " mrs r0, psp \n" 320 " \n" 321 " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ 322 " ldr r2, [r3] \n" 323 " \n" 324 " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ 325 " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ 326 " \n" 327 " stmdb sp!, {r3, r14} \n" 328 " mov r0, %0 \n" 329 " msr basepri, r0 \n" 330 " bl vTaskSwitchContext \n" 331 " mov r0, #0 \n" 332 " msr basepri, r0 \n" 333 " ldmia sp!, {r3, r14} \n" 334 " \n" /* Restore the context, including the critical nesting count. */ 335 " ldr r1, [r3] \n" 336 " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ 337 " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ 338 " msr psp, r0 \n" 339 " bx r14 \n" 340 " \n" 341 " .align 2 \n" 342 "pxCurrentTCBConst: .word pxCurrentTCB \n" 343 ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) 344 ); 345 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 15 марта, 2013 Опубликовано 15 марта, 2013 · Жалоба Раскопки показали, что до 415 ревизии (2008-07-25) он сохранялся. В 415 его сохранение было выкинуто (с сообщением Improve efficiency even further. Introduce the configMAX_SYSCALL_INTERRUPT_PRIORITY feature.) Интересовало это все в рамках вот такого кода: void task1(void* ptr) { for(;;) { //... portENTER_CRITICAL(); //... vTaskSuspend(0); /* 1 */ //... portEXIT_CRITICAL(); /* 2 */ } } Почему-то после чтения доки у меня сложилось впечатление, что задача прервется в точке /*1*/ - соответственно чтобы все не зависло, при этом должен сохраниться счетчик блокировки прерываний, а прерывания - разблокироваться. А после resume - прерывания заблокироваться, а счетчик - восстановиться. Однако сейчас сделано так, что задача прервется в точке /*2*/. Соответственно при попадании в xPortPendSVHandler счетчик всегда будет равен 0, и сохранять \восстанавливать его не нужно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться