Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
bool cpu_check_address(volatile const char *address) {
/* Cortex-M0 doesn't have BusFault so we need to catch HardFault */
/* R5 will be set to 0 by HardFault handler */
/* to indicate HardFault has occured */
register bool result __asm("r5") = 1; /* Set default return value */
register uint32_t sign1 __asm("r1") = 0xDEADF00D; /* set magic number */
register uint32_t sign2 __asm("r2") = 0xCAFEBABE; /* 2nd magic to be sure */
uint32_t scratch;
__asm__ (
"ldrb %[scratch], [%[address]] \n" /* probe address */
:"=r"(result),[scratch]"=l"(scratch)
:[address]"l"(address),"r"(result),"r"(sign1), "r"(sign2)
);
return result;
}Во-первых, вот прямо в этом коде никаких «временных результатов» нет.Потому я назвал его не «неправильным», а «хрупким». Временные результаты легко могут появиться если компилятор решит его заинлацнить — и да, атрибут
inline для этого не требуется.Во-вторых, если вы считаете, что ваш код всё описывает явно и не зависит от обновлений API и компилятора, то вы ошибаетесь.А конкретнее? Представить себе, что какой-то компилятор, после соответствующего обновления станет использовать, скажем, другую инструкцию
ldrb можно... нужно было использовать ldrb.n для надёжности... Что-то ещё?
Так-то от ошибок в компилятора никто не застрахован... Но нарываться-то зачем?Это нужно, что бы GCC понял, что это не переменные, а алиасы регистров.
register.register typename varname __asm("registername"); — это цельная конструкция для описания переменной, живущей в определённом регистре.register — но имеет заметно другой смысл.читаем из стека значение PC (смещение 0x18), добавляем к нему 2 (2 байта — размер инструкции на Cortex-M) и сохраняем обратно в стек.
SCB->CFSR |= BFARVALID_MASK;
if ((SCB->CFSR & BFARVALID_MASK) != 0)
The UFSR bits are sticky. This means as one or more fault occurs, the associated bits are set to 1. A bit that is set to 1 is cleared to 0 only by writing 1 to that bit, or by a reset.

О, как раз по этому поводу засабмитил им несколько лет назад багрепорт
А кто-то пробовал это на RP2040 запускать? Он типа Cortex-M0+
Память там гвоздями прибита, т.е. модель только одна в природе существует.
Есть идея повесить на обработку эксепшенов что-то такое. Если прога полезла куда-то не туда или всякие деления на ноль вылезли...
Проверка корректности адресов в памяти на Cortex-M0/M3/M4/M7