2012-03-26 1 views
0

Я задал этот вопрос на форуме SCB, но не получил ответа Я пытаюсь перенести некоторые проекты из uVision ide в SCB. Проблемы начались с реализации векторной таблицы. Для нелогич-, у меня есть простой C++ кодSourcery CodeBench ARM Cortex-M реализация векторной таблицы

#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 основной (ничтожной)» декларации. Хорошо, я могу добавить эту функцию, но тогда SCB игнорирует мою реализацию векторной таблицы и использует собственный (если я вызываю функцию, адрес которой в VT, я вижу обработчиков фиктивных объектов SCB).

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

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

от Luminary Micro, "startup_gcc.c - код запуска для использования с инструментами GNU" не имеет никакого эффекта слишком

Спасибо.

ответ

1

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

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

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

+0

Игорь, спасибо. Ты прав. Лучшим решением является отдельный заголовочный файл для каждого компилятора. Я нахожу правильное название раздела в файле компоновщика - .cs3.interrupt_vector, но компоновщик помещает объявление моего вектора после генерирования SCB. –

+0

Мне удалось получить проект на C++ с таким же файлом «vectors.c/h» для Keil ARM 6.6 и GCC 6 для Cortex M7. Поскольку компилятор Keil (вызываемый через uVision - нуждается в специальном rant-) имеет предопределенные разделы (например, RESET), я изменил сценарий компоновщика GCC для соответствия. Более сложная задача - установить стек так же. Не совсем разобрался. – Flip

 Смежные вопросы

  • Нет связанных вопросов^_^