-
- Чета я не пойму глубинный смысл конструкции из __disable_interrupt()/__enable_interrupt(), обернутой снаружи в taskENTER_CRITICAL()/taskEXIT_CRITICAL(). Чего добиться-то хотите? Шедулер скрючить? - Lightelf(24.01.2013 09:05)
- Надеть презерватив на свечку. Явные следы последовательного исключения всех подозрительных мест в процессе поиска причины. - vmp(24.01.2013 09:40)
- Гы. Такая конструкция сама по себе может быть причиной. Тут или крестик, или трусы. - Lightelf(24.01.2013 12:58)
- Надеть презерватив на свечку. Явные следы последовательного исключения всех подозрительных мест в процессе поиска причины. - vmp(24.01.2013 09:40)
- А если сделать сообщение на символ-другой меньше, нуль появится? - AD(22.01.2013 17:39)
- Только если стоит точка останова. Ситуация не нравится все больше и больше, потому что во внутренней памяти контроллера работает нормально, во внешней (SDRAM) - только с остановом. Тесты SDRAM проходят. - Vladimir Ljaschko(22.01.2013 17:58)
- Может перед остановом прочитать данные? Поступление команды чтения SDRAM приведёт к тому, что на выходе данные появятся спустя некоторое количество тактов — это время называется задержкой (англ. SDRAM latency) - framer(22.01.2013 18:23)
- А если после sprintf сделать несколько записей в левый буфер, тоже расположенный где-то в SDRAM? Или DSB() поставить? - AD(22.01.2013 18:17)
- Либо в SDRAM не работает байтовая запись, либо это шалит кеш (а он есть в этом процессоре?). - vmp(22.01.2013 18:09)
- Только если стоит точка останова. Ситуация не нравится все больше и больше, потому что во внутренней памяти контроллера работает нормально, во внешней (SDRAM) - только с остановом. Тесты SDRAM проходят. - Vladimir Ljaschko(22.01.2013 17:58)
- А если вынести char buffer[512 + 1]; из локальной области lpc_printf или сделать динамическое выделение памяти под buffer, что нибудь измениться? - framer(22.01.2013 13:34)
- А если так sprintf(buffer, "$s", "Test message...\n"); Кстати буфер дебагером смотришь как набор байтов или как строку? - Codavr(22.01.2013 12:35 - 12:38)
- (char *) из sprintf'а уберите. Что-то изменилось? - Ксения(22.01.2013 12:34)
- все работает, если пройти в спринтфе по шагам. Худший вариант. Похоже, нужно все таки знать, как работает FreeRTOS. - Vladimir Ljaschko(22.01.2013 13:16)
- Нуля нет -- а что вместо нуля? ARM, стек растёт вниз. Затирать конец буфера уж точно не может. Покажи sprintf.c здесь (нет IAR). Вариант: таки прерывания не запрещаются? И обработчик портит какой-то регистр (не сохраняется и т.п.) и потому fk0(125 знак., 22.01.2013 13:44)
- Вместо нуля мусор который был до вызова sprintf. В терминал летит мусор + JTAGом вижу в отладчике на точке останова после sprintf. IARовский sprintf: Молодой коллега(369 знак., 22.01.2013 14:31)
- И как именно определяется, что "нуля нет"? Может метод анализа глючный, а со sprintf всё ок? - fk0(22.01.2013 13:45)
- Фигня получается. sprintf засунут между __disable_interrupt и __enable_interrupt(). Ты говоришь, что перед __enable_interrupt() нуля нет. Но как FreeRTOS может вмешаться если прерывания под запретом? Может это проц какой хитрый которому доступен Codavr(23 знак., 22.01.2013 13:33)
- "мопед не мой", LPC4300 - Vladimir Ljaschko(22.01.2013 13:38)
- Там по DMA никто напакостить не может? - vmp(22.01.2013 14:22)
- Больно прецизионно для DMA. Хотя реальность такие фортеля выкидывает. - Codavr(22.01.2013 14:48)
- А там мусор вместо нуля? Попробуй буфер инициализировать чем нить, чтобы убедиться sprintf не пишет или затирается чем-то. Ну там 0xAA допустим. - Codavr(22.01.2013 13:45)
- Там по DMA никто напакостить не может? - vmp(22.01.2013 14:22)
- "мопед не мой", LPC4300 - Vladimir Ljaschko(22.01.2013 13:38)
- Нуля нет -- а что вместо нуля? ARM, стек растёт вниз. Затирать конец буфера уж точно не может. Покажи sprintf.c здесь (нет IAR). Вариант: таки прерывания не запрещаются? И обработчик портит какой-то регистр (не сохраняется и т.п.) и потому fk0(125 знак., 22.01.2013 13:44)
- +1 - Codavr(22.01.2013 12:38)
- Нет, ичего не изменилось. - Молодой коллега(22.01.2013 13:25)
- все работает, если пройти в спринтфе по шагам. Худший вариант. Похоже, нужно все таки знать, как работает FreeRTOS. - Vladimir Ljaschko(22.01.2013 13:16)
- А остальное-то в буфере есть? Строка "Test message...\n" туда прописалась? - Ксения(22.01.2013 12:17)
- Да всё полностью - "Test message...\n" в буфере лежит как должно быть. - Молодой коллега(22.01.2013 12:22)
- Под FreeRtos надо смотреть на переполнение стека для таска. Можно проверить этим uxTaskGetStackHighWaterMark. - framer(22.01.2013 12:15)
- Я допускаю что где-то стек переполняется и что-то портится, но сразу после sprintf должно быть всё в порядке. Сейчас всего одна задача и стека для нее выделено с 5икратным запасом. - Молодой коллега(22.01.2013 12:30)
- а сколько выделили, какой STACK_SIZE в параметрах линкера? irnt(44 знак., 22.01.2013 20:35)
- Я допускаю что где-то стек переполняется и что-то портится, но сразу после sprintf должно быть всё в порядке. Сейчас всего одна задача и стека для нее выделено с 5икратным запасом. - Молодой коллега(22.01.2013 12:30)
- Чета я не пойму глубинный смысл конструкции из __disable_interrupt()/__enable_interrupt(), обернутой снаружи в taskENTER_CRITICAL()/taskEXIT_CRITICAL(). Чего добиться-то хотите? Шедулер скрючить? - Lightelf(24.01.2013 09:05)