Перейти к содержанию
    

Правильное разложение кода по файлам

Всем привет. Прошу прощение за корявое название темы )

 

Суть вопроса такова- пишу проект на STM32 в CooCox IDE.

 

В проекте используется SPI, прерывания от него и от GPIO.

 

Вопрос- как грамотно разложить код проекта по файлам.

 

в main.c у меня находится только основной цикл и перед ним вызов всех инициализирующих функций.

 

В Configuration.c / .h Хранятся функции инициализации всего (RCC, EXTI, GPIO, SPI......)

 

В stm32f10x_it.c Находятся обработчики прерываний от SPI и от GPIO

 

В SPIProtocol.c / .h Хранится логика протокола обмена данными по SPI

 

Естественно в функциях обработки прерываний от SPI используются переменные и функции, определенные в SPIProtocol.c

 

При компиляции ошибок и предупреждений нет. Однако протокол работает не правильно. Если обработчик прерывания от SPI перенести в файл SPIProtocol.c - то все начинает работать нормально.

 

С чем это связано?

 

Я пробовал и подключать SPIProtocol.h через инклуд, чтобы объявленные там переменные и функции стали доступны. И пробовал объявлять их заново в stm32f10x_it.c через extern. Результат один- работает не правильно.

 

Как все-таки правильно разбивать проект на файлы?

 

Еще бывает, что одно прерывание используют две совершенно логически не связанные части программы. Например это справедливо для прерываний от GPIO. Для EXTI от 10 до 15 одно общее прерывание. Однако, ножки эти могут быть назначены совсем разным логическим частям программы. Допустим одна обрабатывает LCD экран, другая энкодер. Логично было бы создать свои файлы - один для алгоритма работы с энкодером, а второй для индикатора. Куда тогда девать общий обработчик прерывания?

 

Спасибо. Надеюсь не очень сумбурно получилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При компиляции ошибок и предупреждений нет. Однако протокол работает не правильно. Если обработчик прерывания от SPI перенести в файл SPIProtocol.c - то все начинает работать нормально.

1. А вы уверены что предупреждений нет? Может быть у вас просто уровень предупреждений вообще отключен и компилятор их не показывает? Попробуйте максимально возможный уровень включить.

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

3. Подозреваю, что никто не ответит на ваш вопрос более конкретно до того как вы не предоставите проект, точнее два- работающий и неработающий. Может быть проблема вовсе не там, где вы ее ищете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда.

Странно, что варнингов нет. Обычно какие-то в немаленьком проекте есть, особенно в процессе отладки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...