Цитата(cyrax0 @ Jan 15 2015, 14:35)

Не очень понимаю, с какой стати errno может быть вынесен в отдельную секцию. У меня стандартные секции ROM, RAM, CMMRAM. В map-файле errno, скорее всего, вот он:
__iar_Errno 0x20008bdc 0x4 Data Gb errno.o [3]
Находится в стандартной секции RAM.
RAM - это не секция, это одна из целевых областей линковки.
Я говорил о выходных секциях компилятора (для IAR это: .text, .bss и т.п.).
Часто бывает что в библиотеках определяют собственные имена секций, для возможности более оптимально размещать их в памяти.
Посмотрел у себя в map-файле:
Код
.bss zero 0x40006ef8 0x8 errno.o [3]
__iar_Errno 0x40006efc 0x4 Data Gb errno.o [3]
__iar_Tls_setup___iar_Errno 0x40006ef8 0x4 Data Gb errno.o [3]
Как видно - в .bss-секцию из файла
errno.o слинкованы 8 байт (две переменных:
__iar_Errno и
__iar_Tls_setup___iar_Errno).
Вот этот кусочек и можно перенести в отдельный регион
MPU_RO_mem, который потом закрыть по записи MPU. В icf-файле:
place in MPU_RO_mem {section .bss object errno.o};Правда косяк, что прерывание будет происходить и при модификации
__iar_Tls_setup___iar_Errno если она будет случаться. Это нужно будет учесть в ISR.
Минус такого способа конечно в том, что гранулярность защиты памяти в MPU довольно большая (дискретность границ вроде около 1 кБ).
Так что потеряете на этом размер ОЗУ равный гранулярности.
Можно конечно смаппировать
MPU_RO_mem на адреса, где нет ОЗУ. Но тогда (если нужно значение errno) надо будет в ISR разбирать код команды вызвавшей сбой защиты
и определять регистр-источник записываемого значения.
Цитата(cyrax0 @ Jan 15 2015, 14:35)

Если править библиотеки, то проще уж наверное в math.h добавить проверку аргументов, чтобы не заморачиваться с MPU? С ним я еще не работал.
Зато будет польза что разобрались с ним