Si está utilizando STM32, probablemente tenga la posibilidad de enmascarar interrupciones específicas. Si está seguro de que solo la tarea y la interrupción del giro son los dos "hilos" que acceden a esta memoria compartida, podría enmascarar el giro del ISR. De esta manera, todas las demás interrupciones aún se podrían permitir, pero el acceso a la memoria compartida sigue siendo "atómico".
No sé qué MCU / CPU específica está ejecutando, pero el registro para enmascarar bits en Cortex-M3 / 4 se llama:
$$ EXTI- > IMR $$
EDITAR:
El doc indica en la página 69:
"Si se puede acceder a una sección crítica mediante una Rutina de servicio de interrupción (ISR) y una tarea, es necesario deshabilitar las interrupciones para proteger la región crítica".
Este suele ser el caso, a menos que pueda garantizar de otro modo que el ISR que tiene acceso a los datos compartidos no se active.
Cuando usas uC / OS-III OS_CRITICAL_ENTER () y OS_CRITICAL_EXIT () I asumo ellos llaman a la interrupción global deshabilitar / habilitar, pero como mencioné anteriormente, puedes enmascarar y deshabilitar las interrupciones que tengan acceso a estos datos compartidos antes de acceder a estos datos, luego habilítelos nuevamente cuando termine de acceder a los datos compartidos.
También hay otras formas de hacerlo. Si tiene un búfer de anillo y quizás algunas variables de índice, puede usar OS_CRITICAL_ENTER () justo antes de leer las variables de índice (que son memoria compartida) en una variable local y OS_CRITICAL_EXIT () después. No es necesario copiar el búfer de anillo, ya que no accederá a la misma dirección de memoria al mismo tiempo, suponiendo que los datos de escritura ISR y los datos de lectura del código de la aplicación. Copiar a las variables locales solo tomará algunos ciclos, por lo que las posibilidades de interrupciones son muy bajas durante este tiempo. También creo que la mayoría de las MCU / CPU ARM guardan una interrupción de cada tipo (el bit de indicador de interrupción específico) y cuando llamas a OS_CRITICAL_EXIT () se servirán. Si sucede que dos de las mismas interrupciones se activaron durante la copia de la variable local, una se perderá, pero esto es muy desagradable.