Skaf 0 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Всем привет. Прошу прощение за корявое название темы ) Суть вопроса такова- пишу проект на 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 17 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба При компиляции ошибок и предупреждений нет. Однако протокол работает не правильно. Если обработчик прерывания от SPI перенести в файл SPIProtocol.c - то все начинает работать нормально. 1. А вы уверены что предупреждений нет? Может быть у вас просто уровень предупреждений вообще отключен и компилятор их не показывает? Попробуйте максимально возможный уровень включить. 2. Компилятору по барабану, в каком файле что расположено, если грамотно произведено объявление общих функций и переменных (через директиву extern). Иногда бывают зависимые вещи, которые могут зависеть от порядка следования хедер-файлов в головном инклуде. Но если у вас меняется результат(работает-неработает) от порядка следования си-файлов - это нихт гут. 3. Подозреваю, что никто не ответит на ваш вопрос более конкретно до того как вы не предоставите проект, точнее два- работающий и неработающий. Может быть проблема вовсе не там, где вы ее ищете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skaf 0 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Спасибо за ответ. Попробую тогда вырезать из проекта все лишнее, оставить только этот момент, о котором шла речь. И тогда выложу его сюда. Странно, что варнингов нет. Обычно какие-то в немаленьком проекте есть, особенно в процессе отладки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться