-
- Думаю нужно рассказать чем дело кончилось ...дело с printf'ом. Молодой коллега(446 знак., 20.04.2013 18:20)
- При 8-битовом доступе (выбирается ногами DQM) нужно использовать D0-D8 -- в этом дело? - fk0(20.04.2013 21:32)
- Правильно молодой все проанализировал - раз используется побайтный доступ, то мутить биты можно только внутри каждого байта шины данных. А то, что сразу накосячил - тоже неплохо, зато теперь запомнит навсегда :)) - MBedder(20.04.2013 21:35)
- Так их мутить ещё одинаково надо в старшем и младшем байте! - fk0(20.04.2013 21:45)
- Совершенно необязательно - внутри каждого байта мути как хочешь, т.к. в какой бит записал - из него же и прочитаешь, коль скоро в биты запись идет побайтово - MBedder(20.04.2013 21:50)
- Я вас умоляю! 3 месяца разбирался. Неплохо, совсем неплохо. - SciFi(20.04.2013 21:38)
- ...под чутким руководством старших товарищей ;) - Codavr(20.04.2013 23:14)
- Да, shame on me! - Vladimir Ljaschko(22.04.2013 01:19)
- Если бы знать сразу что косяк с памятью разобрался бы за пять минут, а так время ушло на printf, FreeRTOS, ожидание стартеркитовского кита, переписку с NXP и т.д. см. обсуждение ниже. Осн. версия была что баг в проце. Ну и главная ошибка - плохой Молодой коллега(13 знак., 20.04.2013 22:32)
- Тест памяти? Если это единственный урок, который будет вынесен из этой истории, то хреновато как-то. Я бы на организационные, а не технические моменты посмотрел пристальнее. Это, скорее, к вашему начальству. - SciFi(20.04.2013 22:40)
- Ввести штампики по госту в схемы и обязать расписываться на бумажных копиях после ознакомления всем трём. Кто разраб., пров. и утв. Вдумчивое изучение схемы кем-то третьим обычно даёт результаты. - fk0(20.04.2013 23:15)
- Нет это не единственный урок, второй урок в том что нужно было разобраться как работает SDRAM(хотя бы поинтересоваться зачем нужны выводы DQM). Если есть ещё что-то пожалуйста озвучьте, и до начальства я постараюсь донести вашу мысль. - Молодой коллега(20.04.2013 23:00)
- Тест памяти? Если это единственный урок, который будет вынесен из этой истории, то хреновато как-то. Я бы на организационные, а не технические моменты посмотрел пристальнее. Это, скорее, к вашему начальству. - SciFi(20.04.2013 22:40)
- Не факт, что три месяца, а факт, что разобрался, и факт, что рассказал, чтобы другие
молодыена те же грабли не наступили - MBedder(20.04.2013 21:40)- Хз, всех фактов не знаю. Просто у меня такое всплывало за 5 минут. SciFi(133 знак., 20.04.2013 21:41 - 21:46)
- Быстро ехал - жопу стер(с) :)) - MBedder(21.04.2013 00:23)
- Запомню :-))) - Shatun_(04.09.2017 11:45)
- Быстро ехал - жопу стер(с) :)) - MBedder(21.04.2013 00:23)
- Хз, всех фактов не знаю. Просто у меня такое всплывало за 5 минут. SciFi(133 знак., 20.04.2013 21:41 - 21:46)
- ...под чутким руководством старших товарищей ;) - Codavr(20.04.2013 23:14)
- Так их мутить ещё одинаково надо в старшем и младшем байте! - fk0(20.04.2013 21:45)
- Правильно молодой все проанализировал - раз используется побайтный доступ, то мутить биты можно только внутри каждого байта шины данных. А то, что сразу накосячил - тоже неплохо, зато теперь запомнит навсегда :)) - MBedder(20.04.2013 21:35)
- При 8-битовом доступе (выбирается ногами DQM) нужно использовать D0-D8 -- в этом дело? - fk0(20.04.2013 21:32)
- А питание не причем? Раз так избирательно, все пишется, нули нет. - mazur(04.03.2013 10:48)
- Не, проверка питания - это то, с чего начинается работа программиста :) - Vladimir Ljaschko(04.03.2013 10:56)
- Кому интересно - получили плату от StarterKit. Перепаяли туда свою SDRAM, запустили свой код - все работает. Отличия только в микроконтроллере, ну и плата своя. Плата перепроверена десяток раз. Значит, LPC43 в корпусе с выводами. Жду ответа от NXP. - Vladimir Ljaschko(03.03.2013 23:12)
- Какие предварительные выводы вы сделали? Виноват процессор? или определённая ревизия? или тип SDRAM ? Интересуюсь поскольку посматриваю на 4357. - =AlexD=(04.03.2013 10:34)
- Решили, что процессор именно в корпусе с планарными выводами LPC4330FBD144. LPC4357FET256 работает без проблем с той же SDRAM 16 бит. - Vladimir Ljaschko(04.03.2013 10:55)
- Хреново :-( - =AlexD=(04.03.2013 11:03)
- Почему? Нужно смелее использовать BGA, а то пошли на поводу у производства, которое паять BGA может, но не хочет. - Vladimir Ljaschko(04.03.2013 11:34)
- У меня нет проблем с БГА, есть и опыт и рабочие платы, но есть распоряжение гендира отложить внедрение БГА в производстве на несколько лет ;-(. - =AlexD=(04.03.2013 13:02)
- Есть какие-либо понятные аргументы для этого? - Alex B.(05.03.2013 00:44)
- Отдел комплектации не знает куда заказывать пайку с приемлемым процентом брака. (вообще то там ещё личный фактор замешан, но сути дела это не меняет) - =AlexD=(05.03.2013 06:38)
- Мы раньше заказывали пайку BGA Резониту, с рентгенконтролем, потом сами научились паять в печке. Без рентгена, к сожалению, но процент брака очень небольшой. Проверка пайки - функциональный контроль платы. Всё что нужно - это правильно разведенная alex68(176 знак., 05.03.2013 13:12)
- Ахренеть, USB 480 по плате пускаете, а где BGA без брака припаять - не знаете... - Alex B.(05.03.2013 12:57)
- Небольшую партию сами паяли. - =AlexD=(05.03.2013 13:16)
- Отдел комплектации не знает куда заказывать пайку с приемлемым процентом брака. (вообще то там ещё личный фактор замешан, но сути дела это не меняет) - =AlexD=(05.03.2013 06:38)
- Вот и получается мертвая ниша сложных контроллеров в выводном корпусе - кстати, NXP не перевела его в "production", хотя мы купили через digikey. И это понятно, потому что для производителей мэинстрим в БГА. - Vladimir Ljaschko(04.03.2013 14:22)
- нет слов описать мои чувства - =AlexD=(04.03.2013 14:25)
- Второй ответ NXP - тщательный уход от темы. Напоминаю, идентичный код работает на старките от starterkit и не работает на своей плате. Отличие в корпусе контроллера 256 BGA/144 LQFP. Наша плата визуально разведена лучше. Vladimir Ljaschko(3740 знак., 13.03.2013 10:30)
- Ответ NXP бля "... Add a small capacitor to the CLK signal to delay it a little bit" - Vladimir Ljaschko(04.03.2013 19:49)
- Хм-м, понятно, отпишись по результатам эксперимента. - =AlexD=(05.03.2013 06:42)
- А к чему неопределённый артикль "бля"? А если бы они посоветовали делать загзаги дорожками, как на платах "профессионального уровня"? Или тупо измерить тайминги осциллографом? - SciFi(04.03.2013 21:16)
- По поводу артиклей. Еще раз пересмотрели трассировку, проводник CLK короче данных на 15 мм. Но! Контроллер EMC имеет регистр задержки CLK, которую можно изменять в пределах 3,5 ns. Так что Vladimir Ljaschko(406 знак., 05.03.2013 12:55)
- На Атмеле приходилось не конденсатор вешать, а впаивать последовательно в CLK резистор в 27 Ом. Причем резистор понадобился только на второй партии плат. - vmp(05.03.2013 14:23)
- А какая была длина проводника? - Vladimir Ljaschko(05.03.2013 16:02)
- PCAD говорит, что 933 mil (24 mm). - vmp(05.03.2013 16:26)
- А какая была длина проводника? - Vladimir Ljaschko(05.03.2013 16:02)
- На Атмеле приходилось не конденсатор вешать, а впаивать последовательно в CLK резистор в 27 Ом. Причем резистор понадобился только на второй партии плат. - vmp(05.03.2013 14:23)
- К тому, что не верю в такие простые способы. Буду рад, если окажется, что ошибаюсь. - Vladimir Ljaschko(04.03.2013 22:38)
- И зря. При разводке SDRAM это сплошь и рядом. С первого раза точно просчитать времянки могут только настоящие спецы. Ну или референс-дизайн повторен один в один. - Dir(05.03.2013 01:02)
- Есть небольшой опыт с LPC2478 - все запустилось с пол-пинка без всяких проблем. Так что "не сплошь". - Vladimir Ljaschko(05.03.2013 08:21)
- поддержу. цитата автора "Отличия только в микроконтроллере, ну и плата своя" почему-то сразу заставила его искать причину в МК, а не на плате. - Snaky(05.03.2013 01:07, ссылка)
- И зря. При разводке SDRAM это сплошь и рядом. С первого раза точно просчитать времянки могут только настоящие спецы. Ну или референс-дизайн повторен один в один. - Dir(05.03.2013 01:02)
- По поводу артиклей. Еще раз пересмотрели трассировку, проводник CLK короче данных на 15 мм. Но! Контроллер EMC имеет регистр задержки CLK, которую можно изменять в пределах 3,5 ns. Так что Vladimir Ljaschko(406 знак., 05.03.2013 12:55)
- нет слов описать мои чувства - =AlexD=(04.03.2013 14:25)
- Есть какие-либо понятные аргументы для этого? - Alex B.(05.03.2013 00:44)
- У меня нет проблем с БГА, есть и опыт и рабочие платы, но есть распоряжение гендира отложить внедрение БГА в производстве на несколько лет ;-(. - =AlexD=(04.03.2013 13:02)
- Почему? Нужно смелее использовать BGA, а то пошли на поводу у производства, которое паять BGA может, но не хочет. - Vladimir Ljaschko(04.03.2013 11:34)
- Хреново :-( - =AlexD=(04.03.2013 11:03)
- Решили, что процессор именно в корпусе с планарными выводами LPC4330FBD144. LPC4357FET256 работает без проблем с той же SDRAM 16 бит. - Vladimir Ljaschko(04.03.2013 10:55)
- Какие предварительные выводы вы сделали? Виноват процессор? или определённая ревизия? или тип SDRAM ? Интересуюсь поскольку посматриваю на 4357. - =AlexD=(04.03.2013 10:34)
- Так вот... После долгой и увлекательной отладки выяснил что sprintf и FreeRTOS к проблеме с нулем в конце строки отношения не имеют да и отсутствие нуля это не сама проблема. Когда запускаю тест памяти без ОС просто в один поток, то тест проходит Молодой коллега(419 знак., 01.02.2013 11:34)
- Пардон за такой вопрос: ерраты на МК и память читали? - SciFi(01.02.2013 13:21)
- Пересадку аппендицита не попробовали? - vmp(01.02.2013 11:46, ссылка)
- Да, придется пробовать. Только долго донора ждать. По-моему контроллер памяти не умеет использовать 32битную микросхему память в 16битном режиме. - Молодой коллега(01.02.2013 11:52 - 11:55)
- Портится память при обращении в прерывании только к слову определённой (16 или 32) разрядности? Если нет, я бы подумал о том, что всё-таки может регистр какой то не сохраняется. А на разных платах: скорость работы разная (разные микросхемы памяти fk0(32 знак., 01.02.2013 12:42)
- Разрядность слова в которое пишется в прерывании и количество слов записываемых за одно прерывание значения не имеет - тест памяти сбоит одинаково. - Молодой коллега(01.02.2013 13:17 - 13:20)
- +1 нужно смотреть АСМ листинг, какие-то траблы с сохранением контекста. - =AlexD=(01.02.2013 12:52)
- Так на работающей eval board перевести контроллер в 16-битный режим? - vmp(01.02.2013 11:56)
- А такое возможно? У вас есть такой опыт? - Молодой коллега(01.02.2013 11:57)
- Упс... Я думал, что на eval board стоят 2 по 16 бит, а не 1 по 32. - vmp(01.02.2013 12:06)
- А такое возможно? У вас есть такой опыт? - Молодой коллега(01.02.2013 11:57)
- Портится память при обращении в прерывании только к слову определённой (16 или 32) разрядности? Если нет, я бы подумал о том, что всё-таки может регистр какой то не сохраняется. А на разных платах: скорость работы разная (разные микросхемы памяти fk0(32 знак., 01.02.2013 12:42)
- Да, придется пробовать. Только долго донора ждать. По-моему контроллер памяти не умеет использовать 32битную микросхему память в 16битном режиме. - Молодой коллега(01.02.2013 11:52 - 11:55)
- День второй: ничего нового. На другой плате с другим кристаллом тоже наблюдаются проблемы при переносе памяти задач во FreeRTOS в SDRAM и тоже только если не ставить остановы в менеджере памяти. Родной пример FreeRTOS наботает на внутренней памяти Vladimir Ljaschko(10 знак., 23.01.2013 17:31)
- А стек-то где, в SRAM или SDRAM? А код в SDRAM стало быть? А из SRAM работает? Или под внутренней памятью понимается FLASH внутренний? А стека точно хватает, переполнение обрабатывается как исключительная ситуация? - fk0(23.01.2013 17:42)
- День второй был потрачен впустую, все вернулось на круги своя Vladimir Ljaschko(685 знак., 24.01.2013 08:50)
- Байтовые чтение/запись проверяли? - =AlexD=(24.01.2013 09:13)
- Да. Эффект: нуль перестает теряться, если Vladimir Ljaschko(686 знак., 24.01.2013 12:03)
- Не понял, т.е. ноль пишется, но перед выходом заменяется на мусор? Или не на мусор а на конкретное значение? Что вообще происходит, не понятно. =AlexD=(215 знак., 24.01.2013 12:20)
- Проверили. Склейка записей ни при чём, влияет просто задержка : 5 NOPов - работает, 4 NOPа - не работает. - Vladimir Ljaschko(24.01.2013 12:52)
- Дык может тайминги того, проверить? - =AlexD=(24.01.2013 12:57)
- Только вопрос - какие тайминги? От чего до чего? Как эти нопы влияют на тайминги SDRAM? В четырех тестах SDRAM тайминги получились правильные, а тут нет? Ошибкой было закладывать дешевую SDRAM, отличную от примененной в старт-ките. - Vladimir Ljaschko(24.01.2013 13:05 - 13:07)
- А сколько стоит write recovery? И если меньше 2, то что будет, если увеличить? - AD(24.01.2013 16:58)
- Как полумера просто понизьте вдвое частоту шины. - =AlexD=(24.01.2013 14:23)
- При частоте в два раза ниже не работает JTAG. Ясно, что не работает память SDRAM, но так за неделю и не удалось подобрать настройки, при которых она работает устойчиво. - Vladimir Ljaschko(30.01.2013 11:49)
- А в настройках отладчика понизить частоту JTAG не помогает? - vmp(30.01.2013 11:52)
- Да, запустили таки на пониженной частоте. Снижение не дало никакого результата - количество ошибок такое же. Сейчас тест памяти не проходит, если крутится FreeRTOS. В монопольке тот же самый тест работает без проблем. И валить на FreeRTOS не Vladimir Ljaschko(60 знак., 31.01.2013 11:29 - 11:43)
- Операционка в спящий режим процессор не переводит? - vmp(31.01.2013 12:08)
- Не может быть несогласованности по числу банков SDRAM между микросхемой и установками контроллера? - vmp(31.01.2013 12:01)
- А может просто какая-то периферия с ПДП подгаживает? При тестировании памяти шедулер задачи не дёргает? Шина SDRAM не совмещена с асинхронной шиной к которой могут быть случайные обращения? - =AlexD=(31.01.2013 11:46)
- ПДП исключено. Подловили, что портятся ячейки с адресами, к которым был доступ до/после переключения шедулером. Казалось бы RTOS, но на другой плате эта же RTOS работает без проблем. Отличия в памяти - где работает - 32 бита, где не работает - 16 Vladimir Ljaschko(107 знак., 31.01.2013 12:12)
- Так вы, значит, функцию printf сразу из многих потоков юзали? Что же в самом начале не сказали? Ксения(314 знак., 02.02.2013 12:39 - 12:44)
- Можно в студию маркировки микросхем, использующихся в 32 и 16битном режимах? - 0men(02.02.2013 00:59)
- Сконфигурировать на рабочей плате контроллер в 16-битный режим не пробовали? - vmp(31.01.2013 12:17)
- В копилку идей. Нашли, что у Стартеркита есть плата с такой же микросхемой. Интересно, как она работает. - Vladimir Ljaschko(31.01.2013 12:19)
- ПДП исключено. Подловили, что портятся ячейки с адресами, к которым был доступ до/после переключения шедулером. Казалось бы RTOS, но на другой плате эта же RTOS работает без проблем. Отличия в памяти - где работает - 32 бита, где не работает - 16 Vladimir Ljaschko(107 знак., 31.01.2013 12:12)
- Да, запустили таки на пониженной частоте. Снижение не дало никакого результата - количество ошибок такое же. Сейчас тест памяти не проходит, если крутится FreeRTOS. В монопольке тот же самый тест работает без проблем. И валить на FreeRTOS не Vladimir Ljaschko(60 знак., 31.01.2013 11:29 - 11:43)
- А в настройках отладчика понизить частоту JTAG не помогает? - vmp(30.01.2013 11:52)
- При частоте в два раза ниже не работает JTAG. Ясно, что не работает память SDRAM, но так за неделю и не удалось подобрать настройки, при которых она работает устойчиво. - Vladimir Ljaschko(30.01.2013 11:49)
- Знаю я как эти тесты памяти пишут, чё та записали, тут же прочитали, типа всё нормуль. Нормальный тест памяти длится ЧАСАМИ и проверки делаются довольно изощрённые. - =AlexD=(24.01.2013 14:21)
- Угу, это я знаю со времен 537РУ. Очевидно, что причина в SDRAM, будем копать. - Vladimir Ljaschko(24.01.2013 15:15)
- Только вопрос - какие тайминги? От чего до чего? Как эти нопы влияют на тайминги SDRAM? В четырех тестах SDRAM тайминги получились правильные, а тут нет? Ошибкой было закладывать дешевую SDRAM, отличную от примененной в старт-ките. - Vladimir Ljaschko(24.01.2013 13:05 - 13:07)
- Дык может тайминги того, проверить? - =AlexD=(24.01.2013 12:57)
- Проверили. Склейка записей ни при чём, влияет просто задержка : 5 NOPов - работает, 4 NOPа - не работает. - Vladimir Ljaschko(24.01.2013 12:52)
- Осциллограф в зубы - и вперёд. Наука требует жертв. - SciFi(24.01.2013 12:18)
- Для начала наука требует соответствующего осциллографа, ибо 120 МГц. - Vladimir Ljaschko(24.01.2013 12:42)
- Может поможет "Memory Barrier" вставить после доступа к внешней памяти. - amx(24.01.2013 12:11, ссылка)
- Не помогло - Vladimir Ljaschko(24.01.2013 12:38)
- Не понял, т.е. ноль пишется, но перед выходом заменяется на мусор? Или не на мусор а на конкретное значение? Что вообще происходит, не понятно. =AlexD=(215 знак., 24.01.2013 12:20)
- +1. А если вместо sprintf в то место программы поставить просто strcpy? - vmp(24.01.2013 09:41)
- Да. Эффект: нуль перестает теряться, если Vladimir Ljaschko(686 знак., 24.01.2013 12:03)
- Байтовые чтение/запись проверяли? - =AlexD=(24.01.2013 09:13)
- День второй был потрачен впустую, все вернулось на круги своя Vladimir Ljaschko(685 знак., 24.01.2013 08:50)
- шепотом... может какие чудеса из-за EOL=='\n'? - Vit(23.01.2013 17:38)
- А стек-то где, в SRAM или SDRAM? А код в SDRAM стало быть? А из SRAM работает? Или под внутренней памятью понимается FLASH внутренний? А стека точно хватает, переполнение обрабатывается как исключительная ситуация? - fk0(23.01.2013 17:42)
- ААА! Профессионалы не используют printf!!! Финские студенты! fk0(372 знак., 22.01.2013 13:38)
- Профессионалы используют то, что проверенно, и работает, и сокращает время отладки и достижения конечного результата. С представленным Вами подходом - пишите на асме. - _basilebox(31.01.2013 21:24, )
- Это доставит Вам удовольствие - но - не денег. - _basilebox(31.01.2013 21:25, )
- Ниже код - Vladimir Ljaschko(22.01.2013 13:41, ссылка)
- Профессионалы используют то, что проверенно, и работает, и сокращает время отладки и достижения конечного результата. С представленным Вами подходом - пишите на асме. - _basilebox(31.01.2013 21:24, )
- c:\Program Files\I*R S*st*ms\Emb*dd*d W*rkb*nch\arm\src\lib\dlib\sprintf.c - vmp(22.01.2013 12:25)
- Спасибо. Если перенести эту функцию в свой исходник и пройти по шагам, то начинает работать правильно. - Молодой коллега(22.01.2013 12:59)
- пальцем в небо - попробовать Library printf formatter:tiny,Small,large,Full. А так же отключить оптимизацию - MegaJohn(22.01.2013 12:01)
- Куда не добавляет? sprintf() не обеспечивает проверки переполнения массива. - Codavr(22.01.2013 11:18 - 11:24)
- Дык отладка на что? Банальное дебажное сообщение в буфере есть, а завершающего нуля нет. Буфер в стеке. - Vladimir Ljaschko(22.01.2013 11:28)
- Спринтфу пофик куда и что писать. А вот как ты результат интерпретируешь и что твоя прога с ним вытворяет, уже твоя забота. Потому я и спросил куда не добавляет. Кстати что ты называешь 0 тоже вопрос. Формулируй вопросы понятнее. - Codavr(22.01.2013 11:44 - 11:46)
- Ну да... В военное время значение нуля может достигать 2 а иногда и 2.5! Формулиройте поточнее какой именно ноль :) - Alex_S135(22.01.2013 12:46, )
- Значит в стеке его кто-то потом затирает. Быть не может, чтобы sprinf нуль не добавлял - код смотрите. Ксения(460 знак., 22.01.2013 11:41)
- Если _formatted_write принимает s приведённое к void*, то внутри функции просматриватся говнокод -- арифметика на void* указателями вообще не очень-то допустима... - fk0(22.01.2013 13:55)
- Почему? "современные стандарты требуют, чтобы представление и требования по выравниванию для void-указателей были теми же, что для указателей на char, что означает взаимозаменяемость этих типов." - Codavr(22.01.2013 14:40, ссылка)
- Нет... sizeof(*(void*)) у конкретного компилятора может быть неизвестно какой, а sizeof(*(char*)) == 1 всегда. У GCC исключение "расширение C", что sizeof в таком случае тоже == 1. Но для других компиляторов не так и бывает, что арифметика над fk0(364 знак., 22.01.2013 17:30)
- sizeof над такими выражениями у конкретного компилятора обязано выдавать ошибку. Codavr(226 знак., 23.01.2013 03:36 - 03:46, ссылка)
- Ошибка должна бы появиться еще раньше - на стадии разыменовывания указателя (void*). Или это не так? - Ксения(23.01.2013 03:40)
- Скорее всего. По крайней мере я такое рисовать точно не стал бы воизбежание недоразумений. По русски это звучит "Хрен знает что по адресу..." - Codavr(23.01.2013 03:48 - 04:07)
- Стихи: "Станем мы всю ночь гуглить, // Чтобы байтик занулить. // Головой об стену биться, // А не лучше ль нам смириться?" :) - Ксения(23.01.2013 03:55)
- :) - Codavr(23.01.2013 03:58)
- Смириться теперь, пожалуй, не получится - перед "молодым коллегой" несмываемый позор :) - Ксения(23.01.2013 04:01)
- :) - Codavr(23.01.2013 03:58)
- Стихи: "Станем мы всю ночь гуглить, // Чтобы байтик занулить. // Головой об стену биться, // А не лучше ль нам смириться?" :) - Ксения(23.01.2013 03:55)
- Скорее всего. По крайней мере я такое рисовать точно не стал бы воизбежание недоразумений. По русски это звучит "Хрен знает что по адресу..." - Codavr(23.01.2013 03:48 - 04:07)
- Ошибка должна бы появиться еще раньше - на стадии разыменовывания указателя (void*). Или это не так? - Ксения(23.01.2013 03:40)
- Стандарт говорит, что sizeof(void) вычислять не положено. А для арифметики (void*) следует приводить к (char*), ессно: стандарт гарантирует, что в этом случае всё будет вменяемо. Если получилось невменяемо, то такой компилятор/проц следует SciFi(34 знак., 22.01.2013 19:05)
- Ссылку на раздел C99, где говорится, что арифметика над void* нормальна? Вот тут утверждают обратное. - fk0(22.01.2013 19:33, ссылка)
- §6.2.6.1 пункт 27 Codavr(1934 знак., 23.01.2013 02:33 - 03:25, ссылка)
- Про арифметику здесь же не сказано. Что должно быть если два void* вычесть? Откуда компилятору знать sizeof в данном случае? - fk0(23.01.2013 11:56)
- Не надо ему знать это. Сейчас некогда рыть стандарт, но там есть пункт, где прописано, что любой указатель обязан быть даблом. Соответственно все правила для арифметики указателей, те же самые что для даблов. - Codavr(23.01.2013 12:02 - 12:08)
- Надоел уже. Нельзя делать арифметику с указателями на void: SciFi(288 знак., 23.01.2013 12:06)
- Этих слов я и ждал. А если в функцию передаётся void* то внутри неё по ошибке арифметику могли сделать. Я вот о чём. - fk0(23.01.2013 12:12)
- ... и получить на выходе компилера трехэтажный мат-перемат. - Codavr(23.01.2013 12:18)
- Неа! В лучшем случае warning, а то и вовсе ничего. Я ж говорю, нарывался (особенно GCC хорош, он в таком случае (void*) как (char*) воспринимает и "маскирует" ошибки), когда в таком случае результат неадекватный. С тех пор ка всю жизнь запомнил. fk0(45 знак., 23.01.2013 14:31)
- И что он в варнинге говорит? "есть опасность неправильно узнать расстояние между двумя объектами расположеными в разных разделах памяти, один в EEPROM, другой в ОЗУ, выберите предпочтительные единицы измерения (дюймы, миллиметры)" - Codavr(23.01.2013 15:31 - 15:34)
- Оба в EEPROM или оба в ОЗУ. Не важно. Важно, что void *p, *q; size_t x=p-q -- здесь в x расстояние в условных sizeof(void), которое может не быть == sizeof(char) как у GCC. - fk0(23.01.2013 17:10)
- Ну не юли. Если одно там, а другое там? - Codavr(23.01.2013 17:18)
- Если одно там, а другое там, то очевидно, полнейший глюкодром. Намекаешь, что оба приводятся к void? А вот фиг, у hitech, например const void* и void* две разные вещи могут быть (24 бита адрес если). И (const void*)0 != NULL вообще из-за 20-го fk0(8 знак., 23.01.2013 17:35)
- Я намекаю, что такое компилер не может как варнинг обрабатывать, если это компилер, а не глюкодром. Это конкрентный еррор. Ну или "вовсе ничего" ушел в себя и не вернулся :) - Codavr(23.01.2013 19:26 - 19:35)
- Кстати, про NULL вспомнилась забавная история: SciFi(300 знак., 23.01.2013 17:58)
- Если одно там, а другое там, то очевидно, полнейший глюкодром. Намекаешь, что оба приводятся к void? А вот фиг, у hitech, например const void* и void* две разные вещи могут быть (24 бита адрес если). И (const void*)0 != NULL вообще из-за 20-го fk0(8 знак., 23.01.2013 17:35)
- Ну не юли. Если одно там, а другое там? - Codavr(23.01.2013 17:18)
- Оба в EEPROM или оба в ОЗУ. Не важно. Важно, что void *p, *q; size_t x=p-q -- здесь в x расстояние в условных sizeof(void), которое может не быть == sizeof(char) как у GCC. - fk0(23.01.2013 17:10)
- Видимо, нельзя полагаться на сообщения компилятора в деле защиты от говнокода. Кстати, есть линты всякие и прочие static code analysis tools. - SciFi(23.01.2013 14:46)
- И что он в варнинге говорит? "есть опасность неправильно узнать расстояние между двумя объектами расположеными в разных разделах памяти, один в EEPROM, другой в ОЗУ, выберите предпочтительные единицы измерения (дюймы, миллиметры)" - Codavr(23.01.2013 15:31 - 15:34)
- Неа! В лучшем случае warning, а то и вовсе ничего. Я ж говорю, нарывался (особенно GCC хорош, он в таком случае (void*) как (char*) воспринимает и "маскирует" ошибки), когда в таком случае результат неадекватный. С тех пор ка всю жизнь запомнил. fk0(45 знак., 23.01.2013 14:31)
- ... и получить на выходе компилера трехэтажный мат-перемат. - Codavr(23.01.2013 12:18)
- И то верно. - Codavr(23.01.2013 12:10)
- Этих слов я и ждал. А если в функцию передаётся void* то внутри неё по ошибке арифметику могли сделать. Я вот о чём. - fk0(23.01.2013 12:12)
- Про арифметику здесь же не сказано. Что должно быть если два void* вычесть? Откуда компилятору знать sizeof в данном случае? - fk0(23.01.2013 11:56)
- Лехко: SciFi(502 знак., 22.01.2013 19:49)
- Это предположение. Мы не знаем, что там арифметика не делается с void. - fk0(22.01.2013 20:34)
- Вообще-то знаем: void - это такой тип, с которым никакая арифметика не делается. Хватит курить траву :-) - SciFi(22.01.2013 22:11)
- Я имею ввиду void* - fk0(22.01.2013 23:02)
- Вообще-то знаем: void - это такой тип, с которым никакая арифметика не делается. Хватит курить траву :-) - SciFi(22.01.2013 22:11)
- Это предположение. Мы не знаем, что там арифметика не делается с void. - fk0(22.01.2013 20:34)
- §6.2.6.1 пункт 27 Codavr(1934 знак., 23.01.2013 02:33 - 03:25, ссылка)
- Ссылку на раздел C99, где говорится, что арифметика над void* нормальна? Вот тут утверждают обратное. - fk0(22.01.2013 19:33, ссылка)
- sizeof над такими выражениями у конкретного компилятора обязано выдавать ошибку. Codavr(226 знак., 23.01.2013 03:36 - 03:46, ссылка)
- Нет... sizeof(*(void*)) у конкретного компилятора может быть неизвестно какой, а sizeof(*(char*)) == 1 всегда. У GCC исключение "расширение C", что sizeof в таком случае тоже == 1. Но для других компиляторов не так и бывает, что арифметика над fk0(364 знак., 22.01.2013 17:30)
- Почему? "современные стандарты требуют, чтобы представление и требования по выравниванию для void-указателей были теми же, что для указателей на char, что означает взаимозаменяемость этих типов." - Codavr(22.01.2013 14:40, ссылка)
- Это sprintf из IAR??? Ну здесь s может иметь неправильное значение. Интересуют подробности _formatted_write(). Можно написать s+=nr_of_chars (для оригинального значения) для проверки. Кроме того... Нет ли такой ситуации, что libc и проект fk0(98 знак., 22.01.2013 13:52)
- Выдернули исходный код из библиотеки и вставили в проект - ничего не меняется. - Vladimir Ljaschko(22.01.2013 15:12)
- Отладка по переписке это особое искусство. Возможны любые варианты :) - Codavr(22.01.2013 13:55)
- Особенно если единицу нулем считать ;) - Vladimir Ljaschko(22.01.2013 15:13)
- Старший коллега "вынудил" зарегистрироваться. Молодой коллега(852 знак., 22.01.2013 12:03)
- Чета я не пойму глубинный смысл конструкции из __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)
- да-да, я тоже вспомнил эти слова "Этого не может быть, потому что не может быть никогда" ;) - Vladimir Ljaschko(22.01.2013 11:54)
- Если _formatted_write принимает s приведённое к void*, то внутри функции просматриватся говнокод -- арифметика на void* указателями вообще не очень-то допустима... - fk0(22.01.2013 13:55)
- Спринтфу пофик куда и что писать. А вот как ты результат интерпретируешь и что твоя прога с ним вытворяет, уже твоя забота. Потому я и спросил куда не добавляет. Кстати что ты называешь 0 тоже вопрос. Формулируй вопросы понятнее. - Codavr(22.01.2013 11:44 - 11:46)
- Дык отладка на что? Банальное дебажное сообщение в буфере есть, а завершающего нуля нет. Буфер в стеке. - Vladimir Ljaschko(22.01.2013 11:28)
- Может целевой массив переполняется. Может snprintf будет вести себя лучше. Ещё вариант делать memset(buf, 0, sizeof buf) перед sprintf :) - amx(22.01.2013 11:20)
- 1. Массив с запасами. 2. Пробовали vsprintf - хуже 3.Вариант хорош, но проект большой с заимствованиями типа FS, lwIP, и прочим - Vladimir Ljaschko(22.01.2013 11:26)
- Тогда сделать свою sprintf с терминальным нулём и проверкой переполнения :) Можно на базе IAR-овской vsprintf (видимо тоже работает не ахти), а если сильно много от функции не надо, можно взять вариант от Chan-а - amx(22.01.2013 11:41, ссылка)
- Обойти - не вопрос, но хочется понять, в чем причина, иначе она где-нить еще вылезет. - Vladimir Ljaschko(22.01.2013 14:57)
- Одобрямс. - Codavr(22.01.2013 15:01)
- Обойти - не вопрос, но хочется понять, в чем причина, иначе она где-нить еще вылезет. - Vladimir Ljaschko(22.01.2013 14:57)
- Тогда сделать свою sprintf с терминальным нулём и проверкой переполнения :) Можно на базе IAR-овской vsprintf (видимо тоже работает не ахти), а если сильно много от функции не надо, можно взять вариант от Chan-а - amx(22.01.2013 11:41, ссылка)
- 1. Массив с запасами. 2. Пробовали vsprintf - хуже 3.Вариант хорош, но проект большой с заимствованиями типа FS, lwIP, и прочим - Vladimir Ljaschko(22.01.2013 11:26)
- Думаю нужно рассказать чем дело кончилось ...дело с printf'ом. Молодой коллега(446 знак., 20.04.2013 18:20)