Решил этот вопрос вынести в отдельную тему.
По совету Сергея Борща переделал критические секция из FreeRTOS для себя.
Так как переделовать пришлось код на асме, а в асме я позорно слаб, поэтому просьба покритиковать если что.
На какие вещи опирался.
Сделал дизасм своего проекта и увидел, что переменная переданная в функцию в конечном счёте оказывается в R0 до выполнения кода функции. Поэтому значение CSPR регистра я сохраняю и соответсвенно восстанавливаю по адресу хранящемуся в R0.
И ещё меня смущает одна вещь, собрал проект с оптимизацией -Os. Естественно никакой передачи параметров в функцию нет, но указатель на переменную всё равно оказался в R0

Но в тоже время я вижу что SP и R0 имеют всегда одинаковое значение до начала выполнения тела функции.
Верно ли моё наблюдение про R0. И если верно ли оно для оптимизированного кода.
хидерник
Код
typedef uint32_t atomic_t;
void StartAtomic(atomic_t volatile *pAtomic);
void EndAtomic(atomic_t volatile *pAtomic);
#define ATOMIC_SECTION_ENTER {volatile atomic_t __atomic; StartAtomic(&__atomic);
#define ATOMIC_SECTION_LEAVE EndAtomic(&__atomic);}
void StartAtomic(atomic_t volatile *pAtomic);
void EndAtomic(atomic_t volatile *pAtomic);
#define ATOMIC_SECTION_ENTER {volatile atomic_t __atomic; StartAtomic(&__atomic);
#define ATOMIC_SECTION_LEAVE EndAtomic(&__atomic);}
сишник
Код
void StartAtomic(atomic_t volatile *pAtomic)
{
/* Disable interrupts as per portDISABLE_INTERRUPTS(); */
asm volatile (
"STMDB SP!, {R1} \n\t" /* Push R1. */
"MRS R1, CPSR \n\t" /* Get CPSR. */
"STR R1, [R0] \n\t"
"ORR R1, R1, #0xC0 \n\t" /* Disable IRQ, FIQ. */
"MSR CPSR, R1 \n\t" /* Write back modified value. */
"LDMIA SP!, {R1}" ); /* Pop R1. */
}
void EndAtomic(atomic_t volatile *pAtomic)
{
asm volatile (
"STMDB SP!, {R1} \n\t" /* Push R1. */
"LDR R1, [R0] \n\t"
"MSR CPSR, R1 \n\t" /* Write back modified value. */
"LDMIA SP!, {R1}" ); /* Pop R1. */
}
{
/* Disable interrupts as per portDISABLE_INTERRUPTS(); */
asm volatile (
"STMDB SP!, {R1} \n\t" /* Push R1. */
"MRS R1, CPSR \n\t" /* Get CPSR. */
"STR R1, [R0] \n\t"
"ORR R1, R1, #0xC0 \n\t" /* Disable IRQ, FIQ. */
"MSR CPSR, R1 \n\t" /* Write back modified value. */
"LDMIA SP!, {R1}" ); /* Pop R1. */
}
void EndAtomic(atomic_t volatile *pAtomic)
{
asm volatile (
"STMDB SP!, {R1} \n\t" /* Push R1. */
"LDR R1, [R0] \n\t"
"MSR CPSR, R1 \n\t" /* Write back modified value. */
"LDMIA SP!, {R1}" ); /* Pop R1. */
}
З.Ы. Работает уже почти час. Пока живёт.
