![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
razrab83
-
Постов
383 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Сообщения, опубликованные razrab83
-
-
1 минуту назад, Forger сказал:
весь нюанс в том, чтобы понять где именно в пакете эта КС после данных, если заранее не известна длина этого поля данных до того, как они все пришли
не очень понятно... зачем знать где конец данных, ДО того как они все пришли? Пришел пакет - вот длинна, получи и распишись. Не весь пришел пакет - жди когда прийдет весь.
В бинарных протоколах
всегдаобычно известен размер пакета. Даже если размера нет в самом пакете. -
23 часа назад, Forger сказал:
можно КС разместить в самом начале
На сколько я понял, не стоит вопрос "помогите разработать новый протокол и формат пакета". Вопрос стоит "подскажите, как переехать в с++, и красиво оформить существующий протокол"?
class TxRS485 { public: TxRS485(u8* frame); //api struct Header getHeader() const; u8 getSize() const; //размер данных, который N const u8 *getData() const; //вовращает указатель на данные, на "u8 byte[N]" const u8 *getFrame() const; //возвращает указатель на весь пакет, на "Header hdr" private: u8 *frame; //сырые нераспарсеные данные всего пакета, включая заголовок, данные, КС. };
в конструкторе можно динамически выделять память и копировать туда весь пакет, а можно просто указатель TxRS485::frame инициализировать аргументом конструктора frame. Отправка в провод по указателю
TxRS485 command(rxBuf); //обработка command Uart::send(command.getFrame(), command.getSize());
ps
КСCRC удобней размещать в конце пакета, даже если пакеты разной длинны. Многие CRC имеют свойства, при котором расчет нового CRC для пакета из "данных+CRC" даёт 0. Удобно проверять
if(calcCrc(frame, size) == 0)// где size = sizeof(Header) + sizeof(data) + sizeof(crc) { //пакет валидный }
В 15.04.2024 в 14:10, Forger сказал:иначе как понять где искать эту самую КС?
в конце пакета )))
-
41 минуту назад, Arlleex сказал:
и недопустимо
допустимо, при явном указании типа. например
template<class A, class B> void func(A a) { B b; ... } void main() { func<MyClass, YourClass>(2);//так норм func(2); //ошибка }
-
1
-
-
Опубликовано · Изменено пользователем razrab83 · Пожаловаться
7 минут назад, tonyk_av сказал:А чем ваш printf() будет отличаться от библиотечного
он будет по %f (или по %k) принимать float
-
12 часов назад, tonyk_av сказал:
Тут пробовали отключать?
Нет. Я же говорю
20 часов назад, razrab83 сказал:его конечно можно заглушить декертивами или настройками, или явным приведением типа к double. Но что-то не очень нравиться работать с double
Придется пока смериться с double, а в дальнейшем возможно писать свой sprintf или использовать сторонний. Их уже навелосипедили не мало.
-
6 минут назад, dimka76 сказал:
-Wformat
с -Wformat предупреждения в gcc нет.
7 минут назад, dimka76 сказал:попробуйте
Вы сами попробуйте.
-
7 минут назад, dimka76 сказал:
А вы в GCC включите все предупреждения, что-то вроде -Wall.
Еще можно употребить ключик -pedantic.
Или оба сразу.включены, оба сразу. предупреждений нет.
-
1 час назад, tonyk_av сказал:
Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен.
Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке:
float pi = 3.14;
Там будет приведение дабла к флоат с последующим присвоением. Поэтому при разрешённом варнинге на приведения типов компилятор справедливо ругается на эту строку:
sprintf(str, "%f", pi);
ни чего не понял..... при чем тут суффикс f? Суфикс f в строке "float pi = ..." абсолютно ни как не влияет и не должен влиять на строку со sprintf().
1 час назад, tonyk_av сказал:Если не указан суффикс "f" после числа с плавающей точкой, то компилятор использует его как double. Посмотрите на код в этой строчке:
float pi = 3.14;
Там будет приведение дабла к флоат с последующим присвоением.
все правильно. я записал "3.14" - считай что (double)(3.14). И что? Далее... я записал float pi = (double)(3.14); - в данной строке произошло неявное преобразование из double во float. Далее pi везде есть float. После, как инициализировалась pi - не важно. пусть будет так
float pi = reinterpret_cast<float>(getMyFloat()); float pi = 3.14; float pi = (float)atof("3.14"); float pi = 3.14f; float pi = sinf(1);
Выбери любой инит по душе. При чем тут вообще неявное преобразование в строке "float pi = 3.14;"? Мне на эту строку компилятор не дает ворнинг. да и если бы давал - да и черт с ним. Меня интересует ворнинг на sprintf.
От способа инициализации pi результат sprintf не зависит. Ворнинг на sprintf в 9.4 будет, а в 8.5 и в gcc не будет.
1 час назад, tonyk_av сказал:Настройки компилятора смотрели? Их там много. Скорей всего, по умолчанию этот варнинг теперь разрешен.
смотрел. там в 100500 окошках куча галочек. отличий не нашел. НО.... скомпилировал в 9,4 и в 8,5 один и тот же файл и сравнил опции компилятора - опции одинаковые
iccarm.exe file.cpp -D USE_HAL_DRIVER -D STM32F429xx -D HSE_VALUE=((uint32_t)16000000) -D ewarm --preprocess=s <path>\ewarm-cm3\Debug\List -o <path>\ewarm-cm3\Debug\Obj --no_cse --no_unroll --no_inline --no_code_motion --no_tbaa --no_clustering --no_scheduling --debug --endian=little --cpu=Cortex-M4 -e --fpu=VFPv4_sp --dlib_config <path>\arm\inc\c\DLib_Config_Normal.h -On --c++ --no_exceptions
но в 9.4 есть ворнинг на sprintf, а в 8.5 нет.
2 часа назад, haker_fox сказал:IAR 9.30.1 for ARM регулярно выдаёт такие предупреждения.
Может в IAR 9-ке добавили этот ворнинг? В gcc версии arm-none-eabi-g++ (GNU Arm Embedded Toolchain 10.3-2021.08) 10.3.1 20210621 (rel ease) тоже нет ворнинга.
-
Опубликовано · Изменено пользователем razrab83 · Пожаловаться
В 27.01.2024 в 19:10, firstvald сказал:Не удается перепрыгивать к местам определения функций или переменных.
в IAR - это лотерея. Ну не научился он это делать. Бывает, иногда сделает переход и даже попадет куда нужно. Но за частую не переходит. У вас какой-то месадж выдал. У меня молча закрывается контекстное меню и я остаюсь на том же месте, без каких либо сообщений. 2024 год на дворе, а IAR какие-то базовые операции навигации не умеет.
Используйте
внешний редакторвнешнюю IDE: Eclipse, VS Code, .... для редактирования. Для отладки - IAR.-
1
-
1
-
-
10 минут назад, AndyBig сказал:
Заимейте привычку указывать после float-констант букву f
а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример
float pi; sprintf(str, "%f", pi);
Но подумал: щя найдется учитель, который будет учить инициализировать переменные перед использованием. Или спросит "а что такое str?". Немного доработал пример... но всё равно "занавеска" кому-то не угодила )). можно ещё и про snprintf(str, 100, ...) вспомнить для str[100].
По делу, вопрос остался: почему
в IAR 8,5 нет предупреждения, а в 9.4 естьв одном проекте есть предупреждение, в другом нет? Почему в iccarm есть предупреждение, а в gcc нет? -
//*.cpp float pi = 3.14; char str[100]; sprintf(str, "%f", pi);
На sprintf() получаю предупреждение Warning[Pa205]: implicit conversion from float to double
До этого работал в IAR 8.5. всегда в %f подсовывал float, ни каких предупреждений. В кубеИде с gcc тоже нет такого предупреждения. В IAR 9.4 - это мой первый проект и вот такое получил.
ну во первых, не хочу этот ворнинг, его конечно можно заглушить декертивами или настройками, или явным приведением типа к double. Но что-то не очень нравиться работать с double, т.к. МК имеет FPU single precision.
-
В 06.06.2005 в 11:37, Oleg_IT сказал:
Что нужно сделать, что бы в IAR отображались русские буквы?
поставить галку Tools->Options...->Editor->File Encoding->Auto-detect
Из вопроса я понял, что проблема в том, что файл уже написан с русскими буквами, но вместо них отображается что-то другое.Закрываем файл , ставим Auto-detect, открываем файл. Другая проблема, что иар не то что не может отобразить русские, но он не может редактировать русские буквы, вместо них "????".
для IAR 8.5: По умолчанию Tools->Options...->Editor->File Encoding->Default character encoding: System
при этом снята галка Tools->Options...->Editor->File Encoding->Auto-detect
создаю новый фаил в иаре - вместо русских вопросики. удаляю или закрываю этот файл. Меняю кодировку на Russian
Tools->Options...->Editor->File Encoding->Default character encoding: Russian (акказываицо существует кодировка и/или набор символов Russian)
создаю новый фаил в иаре - русские буквы как положено печатаются.
Открываю созданный файл в notepad - русские буквы нормально, кодировка автоматом определилась как ANSI.
Можно и в UTF-8, и в 1251, но включить авто-детект и далее как сказал Евгений 1
В 24.10.2023 в 00:12, Евгений 1 сказал:То есть в файле достаточно каким то редактором, например блокнотом добавить одну русскую букву в файл и все.. далее IAR сам сможет работать и вводить и редактировать русский текст.
Это работает, если галка Tools->Options...->Editor->File Encoding->Auto-detect установлена. Даже UTF-8 иар сможет нормально открыть и показать в этой кодировке.
-
Локализовал проблему. Память под хип выделена, но во внешней SDRAM, которая инитится в main. Всем спасибо.
-
уважаемые плюсоводы, подскажите... файл *.cpp, код такой
int *array[] = { new int(1), 0 };
объявлен и определён массив указателей вне тела функции. с компилятором arm-none-eabi-g++ -mcpu=cortex-m4 -std=gnu++17 работает. с IAR ANSI C/C++ Compiler V9.40.1.364/W64 for ARM (--cpu=Cortex-M4, --c++, с++17) зависает до майна на операторе new. На одном и том же МК.
-
Опубликовано · Изменено пользователем razrab83 · Пожаловаться
12 минут назад, juvf сказал:готу Свойства-Дженерал-редактор-аннотация-серч резалтс....
спасибо. помогло.
4 часа назад, razrab83 сказал:Они перекрывают брейки. Пусть будут
матчи в серчесовпадения в окне поискаДа, кстати... а почему "брейки" не исправили? Или есть такое слово у Ожигова?
-
Опубликовано · Изменено пользователем razrab83
Нарушение правил 2.1.в · Пожаловаться17 часов назад, dimka76 сказал:Вкладку результатов поиска закрыть.
Не помогло. Помогло во вкладке поиска сделать "Remove all matches". Но мне не нужны эти стрелки в этом месте. Они перекрывают брейки. Пусть будут
матчи в серчесовпадения в окне поиска, но пусть они будут без стрелок в редакторе. Есть возможность настроить Eclipse так, чтобы результат поиска не выводил эти стрелки в редактор? -
-
В 12.11.2023 в 21:48, ericN сказал:
Пытаюсь принять на ccll68
а пытались принять на 1276 от 68? в обратную сторону есть передача?
-
В 25.08.2023 в 21:13, MaxiMuz сказал:
Так а всетаки CubeIDE не умеет генерить хексы ?
В 25.08.2023 в 15:46, MaxiMuz сказал:Возникла проблем. Как залить прогу с помощью IDE в STM32VLDISCOVERY.
Я не обнаружил встроенной поддержки ST-Link.
она там есть "изкоробки"
Project->Propertias->Debug As->Debug configurations... 2Clik по STM32 C/C++ Application появится новая конфигурация отладки. По умолчанию ST-LINK
-
1
-
-
Опубликовано · Изменено пользователем razrab83 · Пожаловаться
2 часа назад, MaxiMuz сказал:Нет
вот моё предложение:
8 часов назад, razrab83 сказал:По хорошему, так вообще не следует ни чего писать в сгенерированных файлах.
Это не ответ на ваш первичный вопрос, это просто моё предложение. На это предложение вы озвучили вопрос:
Цитатавызывать свой код как функцию из main ?
На этот вопрос я ответил
ЦитатаНи как.
Т.е. вопрос полностью: Как вызывать свой код как функцию из main, если в сгенерированные файлы, в том числе и в маин, ни чего не писать? Ответ полный: При таком подходе, т.е. если в сгенерировнные файлы ни чего не писать, то из майна ни как ни чего не вызвать. Можно вызвать из др. места свою функцию.
На что codenamehawk предлагает решение писать между begin-end в сгенерированные файлы.
5 часов назад, codenamehawk сказал:А если так
Если вы отвечает на первый вопрос, "как писать между бегин-енд?", то зачем меня цитировать?
2 часа назад, MaxiMuz сказал:Но сам факт того что ide решает за меня где мне вставлять свой код, мне не понравился.
Вообще когда 2 автора (ide и вы, или вы и ваш коллега) лезут редактировать один файл - это источник проблем. Вы либо сами пишите main, либо доверьте генератору. Если доверили генератору - то не следует туда соваться. Если сами хотите писать - то запретите генератору генерить. Если вообще не хотите, чтобы ide вам что-то генерировала - не используйте ide (ну или не используйте генератор кода).
-
3 минуты назад, codenamehawk сказал:
А если так:
вопрос был "Как вызывать из main.c, если в main.c ни чего не писать?". И вы предлагаете решение этого вопроса - писать в main.c.
-
Опубликовано · Изменено пользователем razrab83 · Пожаловаться
ещё можно отметить галку "Do not generate the main()". Определить в своем отдельном файле (например в myMain.c) функцию int main() { } и в нем/ней властвовать. Только самому придется вызывать перед while(1) автосгенерированные инит-файлы, такие как
void SystemClock_Config(void);
void MX_GPIO_Init(void);
В принципе ни чего сложного в ините нет, нет рутины по настройки железа, всё скрыто в MX_***_Init(void). Зато уже в вашем myMain.c - ни кто у вас ни чего ни когда не выпилит.
-
3 минуты назад, MaxiMuz сказал:
вызывать свой код как функцию из main ?
Ни как. Я в конфигурации добавил FreeRTOS. Автоматически создается одна задача defaultTask. Отмечаешь её "Code Generation Options" как "As weak". В своем отдельном файле определяешь свою функцию StartDefaultTask пишешь свой while(1) - profit!!!
-
между END и BEGIN должно затереться. Так задумано. Между BEGIN и END не должно. А зачем что-то писать
в сгенерированных файлахмежду END и BEGIN? По хорошему, так вообще не следует ни чего писать в сгенерированных файлах.
Плавный переход C -> C++ под МК
в Программирование
Опубликовано · Пожаловаться
о каком протоколе говорим? Длинннна пакетов в бинарных протоколах известна ещё на этапе карандаша и черновика. Вы не сможете реализовать обмен данными, тем более защищать что-то там избыточным кодом, какие-то объемы данных, не зная размер этих объёмов. Допустим модбас: в каких-то пакетах есть размер данных, в каких-то нет. Но размеры всех всех пакетов известны на этапе проектирования. Пакет запрос чтения группы регистров - фиксированной длинннны. В пакете ответ чтения группы регистров - размер в пакете. Пакет теста - другой размер фиксированной длиннны. Все пакеты разной длинннны, но всё это можно посчитать в рантайме и без всяких пауз. Можете сунуть 100 пакетов в один приёмный буфер и он легко разгребается на отдельные пакеты и легко определяется длиннна каждого и соответственно вычисляется CRC.