Внедрение исходной таблицы CodeBench ARM Cortex-M - PullRequest
0 голосов
/ 26 марта 2012

Я задавал этот вопрос на форуме 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 (нецелесообразно поддерживать 2 IDE) или перемещать таблицу векторов в другое место в памяти.

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

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

Спасибо.

1 Ответ

1 голос
/ 26 марта 2012

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

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

NB. Следует обратить внимание на необходимость добавления маркера extern "C", если вы компилируете как C ++ - иначе компоновщик не увидит ваши обработчики.

...