Visual Studio и Структуры

Я пытаюсь перенести приложение, написанное для микро, в Visual Studio, чтобы мне было легче запускать отладчик и сканировать код, а не отлаживать на чипе, что немного мучительно, когда вы хотите узнать, как работает приложение было написано. Я вовсе не гуру программирования, и я продолжаю получать эту ошибку, перечисленную ниже, которая связана со структурой:

error C2059: syntax error : '.'

Код указан ниже, может кто-нибудь указать мне в правильном направлении.

typedef struct usart_reg_map 
{
    volatile uint32 SR;
    volatile uint32 DR;
    volatile uint32 BRR;
    volatile uint32 CR1;
    volatile uint32 CR2;
    volatile uint32 CR3;
    volatile uint32 GTPR;
}usart_reg_map;

#define USART1_BASE ((struct usart_reg_map*))

typedef struct usart_dev 
{
    usart_reg_map *regs;
}usart_dev;

struct usart_dev usart1 =
{
    .regs = USART1_BASE, 
};

usart_dev *USART1 = &usart1;

3 ответа

Есть две проблемы для рассмотрения:

  • Скорее всего, вы компилируете код как C++. Но C++ - это не C, и наоборот - они не являются совместимыми языками. Вы должны включить компиляцию C, которая обычно делается путем присвоения имени файлу .c вместо .cpp,

  • Даже в режиме C Visual Studio ужасно поддерживает стандарт C. . Синтаксис инициализации известен как обозначенные инициализаторы и был введен в языковом 1999 году. Однако Microsoft настаивала не обновлять их компилятор C, до некоторой нерешительной попытки несколько лет назад. Они могут или не могут поддерживать назначенные инициализаторы, я не знаю.

Я настоятельно рекомендую любому начинающему программисту использовать вместо этого компилятор со стандартным компилятором. Вы можете указать VS использовать компилятор gcc вместо стандартного дерьма, или вы можете загрузить другую IDE, такую ​​как Codeblocks, которая поставляется с предустановленным gcc/mingw по умолчанию.

Во всех случаях много работы, но возможно:

  1. Узнайте, какие классы, структуры, типы и функции вам нужны из микробиблиотеки.
  2. Создайте для них файлы, похожие на библиотеки micros, желательно с одинаковой файловой структурой, но в другом месте. Они будут работать только в версии для ПК.
  3. Создайте новый проект для немикросреды, в которой вместо шага 1 используются файлы из шага 2. Это можно сделать, вероятно, изменив путь включения.

На шаге 2 вы можете даже проявить некоторый интеллект в функциях, если хотите проверить это. Кроме того, вам не нужно изменять какой-либо файл, который запускается на микросхеме, которую вы создали сами, потому что только у микробиблиотеки есть аналог для ПК.

Что касается C99, убедитесь, что вы не используете специфические функции C99 в общем коде (коде вашего микроконтроллера), и, если вам это нужно, создайте этот код в отдельных функциях, которые вы могли бы либо портировать на VS, либо, возможно, они не нужны поскольку они являются частью библиотек микроконтроллеров или фасадных функций.

Ваша конкретная проблема заключается в том, что, как вы обнаружили, назначенный инициализатор .regs = USART1_BASE не работает в Visual Studio.

Я обычно использую GCC и make-файл при тестировании моих проектов микроконтроллеров в Windows. Кажется, это работает намного лучше при попытке использовать функции из определенного стандарта, такого как C99.

Как уже отмечали другие, вам, вероятно, придется сделать много рефакторинга, чтобы весь ваш проект действительно работал на Windows. Я обычно разбиваю свой проект на простые модули, которые я могу скомпилировать и протестировать в Windows с помощью GCC, а затем объединить эти хорошо протестированные модули в более крупное приложение, которое я могу запустить и протестировать на целевом устройстве.

Другие вопросы по тегам