Создание собственной системы стабилизации

okan_vitaliy
oleg70:

Очень похоже на нехватку памяти (стэка, кучи и пр.), больше ничего не могу сказать…

Стек и кучу увеличивал. Думал, что с опциями в проекте что то не так. Взял даже эксемпл для дискавери и вставил в него этот код. Никаких изменений. Я уже не знаю что и думать, то ли у меня баг, то ли в самом кейле. Хотя кейлы - солидная контора. Получается, что sprintf с float опцией можно только в основном цикле при таком раскладе использовать. Причем с целочисленным выводом sprintf работает нормально. Я уже за коптер свой начинаю переживать, может еще чего в компиляторе вылезет и прямой дорогой в китай полетим к праздникам.

rual
okan_vitaliy:

Прошу помощи у создателей систем стабилизации. У меня случился глюк в проекте.

Сомнительная инициализация глобальной переменной temp, лучше сделать так

char temp[30];

oleg70
okan_vitaliy:

может еще чего в компиляторе вылезет и прямой дорогой в китай полетим к праздникам.

У меня тоже до определенного момента “всё летало”, но с постепенным разрастанием кода, начались аналогичные баги, например структура от SD карты перестала заполняться (или затираться ?), тоже вот копаюсь…
А на Keil грешить - последнее дело, тут разбираться уже с программированием надо.

okan_vitaliy
oleg70:

У меня тоже до определенного момента “всё летало”, но с постепенным разрастанием кода, начались аналогичные баги, например структура от SD карты перестала заполняться (или затираться ?), тоже вот копаюсь…
А на Keil грешить - последнее дело, тут разбираться уже с программированием надо.

Я раньше баги в кодевижене находил, а кейл вроде солидный но на 100 процентов не уверен в его правильности. Просто спринтф при выводе в прерывании флоатом очень настораживает. Можешь сам глянуть .
stm32vldiscovery_package.zip
Короче пока баг в прикрепленном файле не найду - не успокоюсь. Нарушается концепция программирования, когда начинаешь костыли вставлять.

oleg70
okan_vitaliy:

Просто спринтф при выводе в прерывании флоатом очень настораживает

Тут ведь, надо понимать, что пишем на старом добром СИ который эволюционировал со времен создания, и не факт, что реализация sprintf была грамотно адаптирована, там одних определений/переопределений типов вагон, короче только дебаггер или дизассемблер…

okan_vitaliy:

пока баг в прикрепленном файле не найду - не успокоюсь

Постулат программиста: “каждая последняя ошибка в коде является предпоследней” 😃

GAV
okan_vitaliy:

Короче пока баг в прикрепленном файле не найду - не успокоюсь. Нарушается концепция программирования, когда начинаешь костыли вставлять.

спросил знакомого спеца - он отправил читать эррату.
>> Cortex-M3 LDRD with base in list may result in incorrect base register
>> when interrupted or faulted

короче, где-то в теле sprintf затесалась эта самая LDRD.

лечится заменой компилятора или выравниванием стека на 16 перед вызовом sprintf

void SysTick_Handler(void)
{
uint32_t oldSP = __get_MSP();
__set_MSP(oldSP & 0xFFFFFFF0);
sprintf(temp,“%05.1f”,a);
sprintf(temp,“%u”,SystemCoreClock);
a+=1.8753456;
__set_MSP(oldSP);
}

okan_vitaliy
GAV:

спросил знакомого спеца - он отправил читать эррату.
>> Cortex-M3 LDRD with base in list may result in incorrect base register
>> when interrupted or faulted

короче, где-то в теле sprintf затесалась эта самая LDRD.

лечится заменой компилятора или выравниванием стека на 16 перед вызовом sprintf

void SysTick_Handler(void)
{
uint32_t oldSP = __get_MSP();
__set_MSP(oldSP & 0xFFFFFFF0);
sprintf(temp,“%05.1f”,a);
sprintf(temp,“%u”,SystemCoreClock);
a+=1.8753456;
__set_MSP(oldSP);
}

Спасибо. В этом наверно и кроется проблема. Вставил сохранение стека в начале моей функции и восстановления в конце моей функции - усэ працюе. А вот если сразу перед спринтом и сразу после него , то выдает черти что. Причем такое впечатление, что спринт вообще не использует указатель вывода. Буфер остается нетронутым. Короче я че то очкую такую конструкцию применять. Повысил уровень оптимизации - вроде без этого костыля работает, иногда правда нулевой результат вываливает. При высокой оптимизации по времени и коду проект виснет. Короче нужно отдохнуть и бухнуть, что бы разгрузить голову. Короче… ВСЕХ С 1 МАЯ. Счастья,Здоровья,Мира ВСЕМ!!!

oleg70
okan_vitaliy:

что спринт вообще не использует указатель вывода

Я, как в воду смотрел… 😃

okan_vitaliy
oleg70:

Я, как в воду смотрел… 😃

И не только в воду смотрел, но и… Эта сцуко еще и по указателю при определенных условиях пишет очень длинные последовательности, короче больше чем буфер. В итоге хардфаулт. Я вообще че то теперь очкую по полной программе. Причем хард может вылететь через полчаса. Облазил инет и нашел на забугорном форуме у чела было похожее дело, но дело ничем не решилось. Ему сказали что спринтф в флоате тяжелая и трудная функция итд и типа пишите Кейлам. Посему вопрос - как прикрутить к кейлу гцц. Хочу попробовать другой компилятор.

oleg70
okan_vitaliy:

Хочу попробовать другой компилятор.

А если проще: - самому сделать аналог sprintf (?), там и надо то делить/умножать и в “char” преобразовывать… и не связываться с родным сишным…

okan_vitaliy
oleg70:

А если проще: - самому сделать аналог sprintf (?), там и надо то делить/умножать и в “char” преобразовывать… и не связываться с родным сишным…

Да это можно, но хотелось все таки разобраться я или компилятор глючит.😒 Проект уже вылизан на всех уровнях оптимизации, а вот спринтф гадит картину. Я его сцуку и запретами прерывания irq и fiq обтянул, а он гадит изнутри.
В версии 5.14 можно менять компилятор, но как сделать так что бы его среда увидела - вот это вопрос. А аналог типа спринта облегченный есть в цли базефлигхта. Если уже ничего не получится, то либо его вставлю, либо сырцы спринта поищу. Советские люди просто так не сдаются.

oleg70

Хотел повторить “подвиг” NAZы и подвесить свою платку с сенсорами на гибком шлейфе, но не тут то было… а шлейф то такой как сделать ? Самые тонкие провода, а их для SPI мне надо минимум 9, вместе получаются довольно жёсткими… вот и затык… - готовый фиг найдешь, да и разъем под него нужен микроскопический…
Кто подкинет идейку ?

okan_vitaliy
oleg70:

Хотел повторить “подвиг” NAZы и подвесить свою платку с сенсорами на гибком шлейфе, но не тут то было… а шлейф то такой как сделать ? Самые тонкие провода, а их для SPI мне надо минимум 9, вместе получаются довольно жёсткими… вот и затык… - готовый фиг найдешь, да и разъем под него нужен микроскопический…
Кто подкинет идейку ?

Старый добрый МГТФ тебе в помощь. У меня есть 0.03 - достаточно мягкий и гибкий. И соединение сделать гибкой петлей. Типа как яйца из лишнего кабеля делают. Думаю одного витка должно хватить.

djdron

можно найти гибкие шлейфы в старой бытовой технике(видеомагнитофоны и т.д) или купить шлейф для сотовых(в слайдерах используется), а паять прямо на дорожки на плате, в большенстве случаях шаг 0.5мм

oleg70
okan_vitaliy:

У меня есть 0.03 - достаточно мягкий и гибкий.

Один фиг жестковато… тогда придется грузить платку свинцом… иначе смысла нет.

djdron:

а паять прямо на дорожки на плате

а не поплавится пленочка ?

strizhmax
oleg70:

а не поплавится пленочка ?

Они в телефонах запаяны. Я так дисплеи от нокии паял.

SergDoc

Макс запретил хвастаться кое чем, а то бы показал как мягко сделать - 0.1 в лаке

oleg70
SergDoc:

а то бы показал как мягко сделать - 0.1 в лаке

Плюнул я на эту затею, закрепил жестко на плате и в коробку… а уж коробочку буду на поролончики ставить, она массивная - эффект тот же…

SergDoc
oleg70:

а уж коробочку буду на поролончики ставить, она массивная - эффект тот же…

стоит или висит вот в чём вопрос… я про иму если что)))

oboldeus
oleg70:

Самые тонкие провода, а их для SPI мне надо минимум 9, вместе получаются довольно жёсткими… вот и затык… - готовый фиг найдешь, да и разъем под него нужен микроскопический…
Кто подкинет идейку ?

Можно использовать шлейфы от DVD всяких - 24 контакта , шаг - 0.5мм , на радиорынках стоят рублей 30 , можно подобрать разной длины - от 10 см до 40 . Из дохлых дивидишек можно и разъемы надергать хоть лежачие хоть стоячие.

Samer

Для oleg70. Я приклеил плату датчиков на скотч к грузику ~ 7 гр. и подвесил на резинки . Провода от шлейфа . У меня I2С и всего 4 провода.