Взгляните на симулятор RARS как на пример простой реализации RIS C V. Он реализует достаточное количество CSR (например, причину исключения, состояние процессора, исключение p c, адрес векторной таблицы и т. Д. c ..), которые вы можете запрограммировать обработчиком прерывания.
Вам понадобятся:
utvec
- устанавливает адрес обработчика исключений ustatus
- для включения / отключения прерываний, uscratch
- требуется программному обработчику исключений, ucause
- сообщает причину исключения uepc
- сообщает адрес незавершенной инструкции при исключении
И некоторые другие. В RARS вы можете видеть регистры, реализованные на дисплее регистров, на вкладке Control and Status .
Я считаю, что RARS поддерживает таймер, поэтому для этого есть несколько CSR. Он также предоставляет блок с плавающей запятой, поэтому некоторые CSR для исключений для этого, а также конфигурацию округления. Для обработки исключений доступа к памяти он имеет utval
. А потом предлагает несколько прилавков. См. Также таблицу 2.2 в Версия документа 20190608-Priv-MSU-Ratified
Я думаю, что ваше использование CSR будет ограничено конфигурацией автономного приложения, например начальной загрузкой и обработкой прерываний, и то, и другое было бы написано на ассемблере.
Трудно представить, что скомпилированный C код (объектные файлы, .o) каким-либо образом затронет CSR. Если у вас есть такой пример, поделитесь им.
В некоторых средах реализация C допускает автономные (например, не размещенные на хосте) программы. Возможно, что такая программа, созданная каким-либо компилятором, включает конфигурацию запуска и обработчик исключений, хотя более вероятно, что они будут предоставлены пользователем. См., Например, http://cs107e.github.io/guides/gcc/