Концептуальная проблема с микропроцессором гарвардской архитектуры и размещением таблицы переходов GCC
Я разрабатываю конвейерный микропроцессор NIOS2 (часть экосистемы Intel FPGA) с нуля в качестве обучающего упражнения. Это процессор с гарвардской архитектурой с отдельными шинами памяти команд и данных.
Когда я компилирую оператор case на C, GCC создает таблицу переходов и помещает ее непосредственно рядом с остальной исполняемой частью кода. Это создает проблему, потому что процессор загружает значения таблицы переходов через шину памяти данных, которая не связана с памятью программ.
На практике я знаю, что отдельные шины памяти подключены через иерархию кеша, но у меня нет кеша, и я поддерживал строгое разделение между двумя шинами.
В качестве обходного пути я сделал программную память двухпортовой и подключил к ней обе шины, но это не похоже на правильное решение.
Есть ли способ заставить GCC разделить таблицу переходов и исполняемый код на разные разделы? Если нет, должно быть? Как правильно думать об этой проблеме?