Jump to content

    

Где сохраняется/восстанавливается uxCriticalNesting?

Как я понял доку, тут должен сохраняться 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     }

Share this post


Link to post
Share on other sites

Раскопки показали, что до 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, и сохранять \восстанавливать его не нужно

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this