Я использую процессор Cortex-M0 с голым металлическим исполнением (без ОС). У нас есть приложение прошивки, в котором мы хотим разрешить третьей стороне писать функцию C, которая будет построена отдельно от остальной части прошивки и загружена в память (вроде библиотеки DLL) и вызывается основной микропрограммой, если она обнаружена.Функция kill из ISR на cortex-m0
Проблема в том, что я хочу запустить эту внешнюю функцию в защищенной среде, чтобы она не нарушала основную прошивку, если она создает исключение сбоя или занимает слишком много времени для выполнения. Так что я хочу сделать, либо из-за жесткой ошибки ISR (для исключений сбоев), либо по таймеру ISR (для проблем с временем выполнения), манипулировать стеком, чтобы убить внешнюю функцию и вернуть выполнение в основную прошивку. Я понимаю, что это будет прямо в RTOS, но основная прошивка уже разработана, и на этот момент потребуются значительные усилия по ее переключению.
Я посмотрел на использование try-catch в C++, но компилятор, похоже, не поддерживает его. Поэтому другой вариант, который я вижу, заключается в том, чтобы написать некоторую сборку, чтобы сохранить указатель стека перед вызовом внешней функции, а из ISR восстановить SP и контекст и перейти к точке возврата в основной прошивке. Может ли кто-нибудь дать какие-либо указания о том, как это сделать, или есть ли более простой способ сделать это?
В RTOS не будет проще, поскольку у них нет положений для динамической загрузки/выполнения.Вам все равно придется предоставить свою собственную оболочку для этой функции. Проблема заключается в том, чтобы уловить исключение и откатить стек, но не допустить, чтобы эта функция находилась в чистом ОЗУ. Если MPU достаточно полностью зависит от вашего макета памяти и того, что вы хотите разрешить функции. Например, он может повредить стек, если он имеет не только его собственный. – Olaf
Вы можете использовать крошечный интерпретируемый язык вместо собственного кода, чтобы предотвратить прямой доступ к ЦП/памяти к стороннему коду? –
Брайан - мы действительно сделали первоначальную реализацию с интерпретируемой сборкой, такой как язык, который использовал excel в качестве ассемблера. Однако логические требования стали такими, что писать на ассемблере было обременительно. Таким образом, мы решили перейти на C. Третья часть не будет иметь прямого доступа к какой-либо статической памяти. Им будут предоставлены функции доступа к массиву фиксированного размера контрольных значений. Их использование локальных переменных в стеке вызывает озабоченность. Cortex-m0 имеет стек процесса, который я мог бы использовать только для этого, но на данный момент я думаю, что мы предоставим некоторые правила использования локальной переменной. – jdbk