Реализация векторной таблицы Sourcery CodeBench ARM Cortex-M

Я задал этот вопрос на форуме SCB, но не получил ответа. Я пытаюсь перенести некоторые проекты из uVision ide в SCB. Проблемы начались с реализацией векторной таблицы. Например, у меня есть простой код C++

#define STACK_TOP 0x20000800
typedef void (*handler_ptr)();

void ResetHandler() { while (1); }
void NMIHandler() { while (1); }
void HardFaultHandler() { while (1); }

__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = {
    (handler_ptr) STACK_TOP,
    ResetHandler,
    NMIHandler,
    HardFaultHandler,
};

Этот код не компилируется, так как библиотека SCB ищет объявление "int main(void)". Хорошо, я могу добавить эту функцию, но тогда SCB игнорирует мою реализацию векторной таблицы и использует собственную (если я вызываю функцию, адрес которой в VT, я вижу фиктивные обработчики SCB).

Как я могу переписать реализацию SCB VT самостоятельно? Пожалуйста, не предлагайте использовать специальные имена функций SC3 (это нехорошо для поддержки двух IDE) или перемещать векторную таблицу в другую ячейку памяти.

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void)

из Luminary Micro "startup_gcc.c - Код запуска для использования с инструментами GNU" также не действует

Спасибо.


person Kirill Obukhov    schedule 26.03.2012    source источник


Ответы (1)


Когда дело доходит до низкоуровневых расширений C для встроенной поддержки, вам вряд ли удастся обойтись одним подходом для обоих компиляторов. Даже официальный дистрибутив CMSIS от ARM по-прежнему имеет отдельные запуски для каждого поддерживаемого компилятора.

Однако то, что может работать лучше, чем явное объявление таблицы, не включает его. Просто объявите обработчики, которые вы хотите реализовать; стартапы CMSIS обычно помечают свои собственные заглушки как СЛАБЫЕ функции, поэтому ваши будут иметь приоритет. Однако вам необходимо убедиться, что вы используете стандартные имена для обработчиков, ожидаемые компоновщиком (например, Reset_Handler, NMI_Handler, WWDG_IRQHandler и т. д.). Дополнительные сведения см. в документах CMSIS и исходных файлах.

NB: Одна вещь, на которую следует обратить внимание, это обязательно добавить маркер extern "C", если вы компилируете как C++, иначе компоновщик не увидит ваши обработчики.

person Igor Skochinsky    schedule 26.03.2012
comment
Игорь, спасибо. Ты прав. Лучшее решение — отдельный заголовочный файл для каждого компилятора. Я нахожу правильное имя раздела в файле компоновщика - .cs3.interrupt_vector, но компоновщик размещает объявление моего вектора после создания SCB. - person Kirill Obukhov; 27.03.2012
comment
Мне удалось получить проект C++, соответствующий тому же файлу vectors.c/h для Keil ARM 6.6 и GCC 6 для Cortex M7. Поскольку компилятор Keil (вызываемый через uVision — требуется специальный rant-) имеет предопределенные разделы (например, RESET), я изменил скрипт компоновщика GCC, чтобы он соответствовал. Сложнее настроить стек так, чтобы он был одинаковым. С этим не совсем разобрался. - person Flip; 19.01.2017