Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Правильное разложение кода по файлам
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Skaf
Всем привет. Прошу прощение за корявое название темы )

Суть вопроса такова- пишу проект на 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 экран, другая энкодер. Логично было бы создать свои файлы - один для алгоритма работы с энкодером, а второй для индикатора. Куда тогда девать общий обработчик прерывания?

Спасибо. Надеюсь не очень сумбурно получилось.
Ruslan1
Цитата(Skaf @ Nov 15 2011, 18:11) *
При компиляции ошибок и предупреждений нет. Однако протокол работает не правильно. Если обработчик прерывания от SPI перенести в файл SPIProtocol.c - то все начинает работать нормально.

1. А вы уверены что предупреждений нет? Может быть у вас просто уровень предупреждений вообще отключен и компилятор их не показывает? Попробуйте максимально возможный уровень включить.
2. Компилятору по барабану, в каком файле что расположено, если грамотно произведено объявление общих функций и переменных (через директиву extern). Иногда бывают зависимые вещи, которые могут зависеть от порядка следования хедер-файлов в головном инклуде. Но если у вас меняется результат(работает-неработает) от порядка следования си-файлов - это нихт гут.
3. Подозреваю, что никто не ответит на ваш вопрос более конкретно до того как вы не предоставите проект, точнее два- работающий и неработающий. Может быть проблема вовсе не там, где вы ее ищете.
Skaf
Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда.
Ruslan1
Цитата(Skaf @ Nov 15 2011, 20:57) *
Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда.

Странно, что варнингов нет. Обычно какие-то в немаленьком проекте есть, особенно в процессе отладки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.