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

Вячик13

Участник
  • Публикаций

    71
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Вячик13

  • Звание
    Участник
  1. Непонятный рестарт программы

    Спасибо, за поздравление. Наконец то оценили. А то с 1983 года, когда я сделал свой первый проект на К1-20 никто ни одного доброго словечка!
  2. Непонятный рестарт программы

    Нет, не лень. И могу читать даже в оригинале. Но, знаете, как в известном анекдоте про немого мальчика: "А раньше я не разговаривал, потому что всё было в порядке". Представьте себе, за 20 проектов у меня не возникало даже потребности в каких-либо ловушках, поскольку всё работало нормально.
  3. Непонятный рестарт программы

    Тогда проконсультируйте, пожалуйста, как. Я в Keile этого никогда не делал. Где это находится?
  4. Непонятный рестарт программы

    Спасибо, но вряд ли. Если это аппаратный сброс, то в любом случае должна была сработать подпрограмма тестирования индикаторов. А она гоняет по индикатору "палочки", а затем отображает дату и версию программы. я бы это увидел. В период наблюдения явления на площадке ещё шли монтажные работы и ничего такого не включалось
  5. Непонятный рестарт программы

    Проверил. Самое подозрительное: memset(Display->Code,'\0',strlen((char *)Display->Code)); //Очистка кодовой строки где Display->Code указатель на массив байт (unsigned char *). Остальные memset все просты и явны. Может быть функция strlen(), а тем более с аргументом-указателем на член структуры может глючить? Хотя в аналогичных проектах всё это работает безукоризненно.
  6. Непонятный рестарт программы

    Нет. Во-первых в данной системе нет интенсивных прерываний: 1) системные часы (каждую миллисекунду); 2) АЦП - 1 раз в 10 миллисекунд; 3) КПДП передатчика SPI (каждую миллисекунду); 4) 2 прерывания UART (не работали, поскольку не было компьютера верхнего уровня). Во-вторых, как я уже писал, аналогичная система и в других проектах (даже есть более нагруженные).
  7. Непонятный рестарт программы

    Обнуляются все статические переменные (по крайней мере я проверил 7-8 разного типа). А какая может быть ошибка чтобы выйти на инициализирующий сброс статических переменных?
  8. Непонятный рестарт программы

    Имеется устройство на базе микроконтроллера STM32F100RC. Для него разработано программное обеспечение под Keil 4.22a: Total RO Size (Code + RO Data) 76796 ( 75.00kB) Total RW Size (RW Data + ZI Data) 7776 ( 7.59kB) Total ROM Size (Code + RO Data + RW Data) 76944 ( 75.14kB) Устройство (весовой терминал ротационных промышленных весов) установлено на промышленном объекте у заказчика в количестве 3 штук. Наблюдается следующий эффект. Через произвольное время (от 3 до 30 минут) происходит сброс программы. Причём сброс странный. Статические переменные обнуляются, но сброс не "ловится" при отладке (установка breakpoint как в в начале SystemInit(), так и в начале main()). Мало того, при рестарте программы должно производиться тестирование дисплеев из 7-сегментных индикаторов (в начале main()), но оно не происходит. В программе используется WDT IWDG, но это не его рук дело. Эти явления происходят на всех 3 устройствах. До этого я разработал более 20 аналогичных проектов на этом же устройстве с аналогичной структурой программы, но подобного никогда не наблюдал. Буду благодарен за любой совет.
  9. Цитата(MegaVolt @ Mar 20 2017, 11:25) Попробуйте в параллель с кварцем подключить резистор 1-10 МОм. Спасибо, помогло. Тема закрыта.
  10. Плата 8-канального АЦП на базе ADS1258-EP. Схема подключения внешнего кварца реализована точно как в описании. Ранее точно такие же платы изготавливались и работали безукоризненно. Не запускается тактовый генератор АЦП при подаче питания. Запускается только после того, как проведёшь пальцем по плате в месте подключения кварца. Что это может быть?
  11. Имеется IAR 6.50 для ARM. Проект для STM32F103VCT6 с использованием scmRTOS V4. Работает связка ADC1 и DMA. Все другие прерывания блокированы. Запуск работы связки происходит в функции main() перед запуском операционной системы: ADC1_CR2_bit.SWSTART=true; //Старт преобразования АЦП OS::run(); Тело прерывания DMA (преобразовывается 9 каналов ADC1): extern "C" void DMA1_Channel1_IRQHandler(void) { OS::TISRW(); DMA_CCR1_bit.EN=false; //Стоп канала DMA DMA_IFCR_bit.CTCIF1=true; //Сброс флага прерывания конца приёма первого канала DMA ADC1_SR_bit.STRT=false; //Сброс флага старта регулярных каналов ADCChannelArray[0]+=ADCChannel.ADCResult[15]; //Перепись результатов очередного преобразования ADCChannelArray[1]+=ADCChannel.ADCResult[14]; ADCChannelArray[2]+=ADCChannel.ADCResult[7]; ADCChannelArray[3]+=ADCChannel.ADCResult[6]; ADCChannelArray[4]+=ADCChannel.ADCResult[3]; ADCChannelArray[5]+=ADCChannel.ADCResult[2]; ADCChannelArray[6]+=ADCChannel.ADCResult[1]; ADCChannelArray[7]+=ADCChannel.ADCResult[0]; ADCChannelArray[8]+=ADCChannel.ADCResult[8];*/ DMA_CCR1_bit.EN=true; //Старт канала DMA ADC1_CR2_bit.SWSTART=true; //Старт преобразования АЦП DMA1Counter++; //Отладочный счётчик прерываний } Проблема в следующем. Ставлю точку остановки для отладчика на вторую строку обработчика прерывания. После каждого запуска происходит чёткая остановка на точке. Убираю точку остановки и пускаю программу, затем через некоторое время останавливаю. Отладочный счётчик показывает два захода в прерывание, а затем, сколько бы я ни запускал и останавливал программу, больше заходов в прерывание не наблюдается. В чём дело?
  12. Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
  13. Цитата(Сергей Борщ @ Sep 16 2015, 10:56) Видимо у вас в настройках среду указано "копилить весь проект как голый Си независимо от расширений файлов" Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
  14. Имеется IAR 6.50 для ARM. Тестовый проект для STM32F103VCT6 (почти пустой). В нём имеются файлы: main.cpp, main.h, startup_stm32f10x_hd.s, stm32f10x_vector.c, stm32f10x_it.c, stm32f10x_it.h. Задействовано одно прерывание - TIM3_IRQHandler. При отладке наблюдается интересный эффект - если обработчик прерывания находится в файле main.cpp, то точки останова в его тексте ставятся и отладчик по ним останавливается. А если я его переношу в файл stm32f10x_it.c, то точки останова не ставятся и отладчик "улетает" (скорее всего при срабатывании прерывания). Такое впечатление, что обработчик при линковании не включается в код программы. Оптимизация при компиляции отключена. Текст обработчика: extern "C" void TIM3_IRQHandler(void) { TIM3_SR_bit.UIF=false; //Сброс флага прерывания таймера ADC it=12; ty=14; tg=it+ty; } Хотя пробовал и без "extern "C" и в файле main.cpp он всё равно работает. Почему?
  15. Проблема с SystemInit()

    Сергей Борщ, приношу Вам свои извинения. Ваш совет оказался верным. Просто я по невнимательности Вместо System написал Systen. Всем спасибо. Вопрос закрыт.