![](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
-
Плавный переход C -> C++ под МК
razrab83 ответил Arlleex тема в Программирование
о каком протоколе говорим? Длинннна пакетов в бинарных протоколах известна ещё на этапе карандаша и черновика. Вы не сможете реализовать обмен данными, тем более защищать что-то там избыточным кодом, какие-то объемы данных, не зная размер этих объёмов. Допустим модбас: в каких-то пакетах есть размер данных, в каких-то нет. Но размеры всех всех пакетов известны на этапе проектирования. Пакет запрос чтения группы регистров - фиксированной длинннны. В пакете ответ чтения группы регистров - размер в пакете. Пакет теста - другой размер фиксированной длиннны. Все пакеты разной длинннны, но всё это можно посчитать в рантайме и без всяких пауз. Можете сунуть 100 пакетов в один приёмный буфер и он легко разгребается на отдельные пакеты и легко определяется длиннна каждого и соответственно вычисляется CRC. -
Плавный переход C -> C++ под МК
razrab83 ответил Arlleex тема в Программирование
не очень понятно... зачем знать где конец данных, ДО того как они все пришли? Пришел пакет - вот длинна, получи и распишись. Не весь пришел пакет - жди когда прийдет весь. В бинарных протоколах всегда обычно известен размер пакета. Даже если размера нет в самом пакете. -
Плавный переход C -> C++ под МК
razrab83 ответил Arlleex тема в Программирование
На сколько я понял, не стоит вопрос "помогите разработать новый протокол и формат пакета". Вопрос стоит "подскажите, как переехать в с++, и красиво оформить существующий протокол"? 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) { //пакет валидный } в конце пакета ))) -
Плавный переход C -> C++ под МК
razrab83 ответил Arlleex тема в Программирование
допустимо, при явном указании типа. например template<class A, class B> void func(A a) { B b; ... } void main() { func<MyClass, YourClass>(2);//так норм func(2); //ошибка } -
он будет по %f (или по %k) принимать float
-
Нет. Я же говорю Придется пока смериться с double, а в дальнейшем возможно писать свой sprintf или использовать сторонний. Их уже навелосипедили не мало.
-
с -Wformat предупреждения в gcc нет. Вы сами попробуйте.
-
включены, оба сразу. предупреждений нет.
-
ни чего не понял..... при чем тут суффикс f? Суфикс f в строке "float pi = ..." абсолютно ни как не влияет и не должен влиять на строку со sprintf(). все правильно. я записал "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 не будет. смотрел. там в 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 нет. Может в IAR 9-ке добавили этот ворнинг? В gcc версии arm-none-eabi-g++ (GNU Arm Embedded Toolchain 10.3-2021.08) 10.3.1 20210621 (rel ease) тоже нет ворнинга.
-
в IAR - это лотерея. Ну не научился он это делать. Бывает, иногда сделает переход и даже попадет куда нужно. Но за частую не переходит. У вас какой-то месадж выдал. У меня молча закрывается контекстное меню и я остаюсь на том же месте, без каких либо сообщений. 2024 год на дворе, а IAR какие-то базовые операции навигации не умеет. Используйте внешний редактор внешнюю IDE: Eclipse, VS Code, .... для редактирования. Для отладки - IAR.
-
а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример 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.
-
поставить галку 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 Это работает, если галка 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. На одном и том же МК.
-
И снова CUBE IDE
razrab83 ответил Vlad_G тема в Cредства разработки для МК
спасибо. помогло. Да, кстати... а почему "брейки" не исправили? Или есть такое слово у Ожигова? -
И снова CUBE IDE
razrab83 ответил Vlad_G тема в Cредства разработки для МК
Не помогло. Помогло во вкладке поиска сделать "Remove all matches". Но мне не нужны эти стрелки в этом месте. Они перекрывают брейки. Пусть будут матчи в серче совпадения в окне поиска, но пусть они будут без стрелок в редакторе. Есть возможность настроить Eclipse так, чтобы результат поиска не выводил эти стрелки в редактор? -
И снова CUBE IDE
razrab83 ответил Vlad_G тема в Cредства разработки для МК
-
Прием Lora с чипом LLCC68
razrab83 ответил ericN тема в Wireless/Optic
а пытались принять на 1276 от 68? в обратную сторону есть передача? -
она там есть "изкоробки" Project->Propertias->Debug As->Debug configurations... 2Clik по STM32 C/C++ Application появится новая конфигурация отладки. По умолчанию ST-LINK
-
вот моё предложение: Это не ответ на ваш первичный вопрос, это просто моё предложение. На это предложение вы озвучили вопрос: На этот вопрос я ответил Т.е. вопрос полностью: Как вызывать свой код как функцию из main, если в сгенерированные файлы, в том числе и в маин, ни чего не писать? Ответ полный: При таком подходе, т.е. если в сгенерировнные файлы ни чего не писать, то из майна ни как ни чего не вызвать. Можно вызвать из др. места свою функцию. На что codenamehawk предлагает решение писать между begin-end в сгенерированные файлы. Если вы отвечает на первый вопрос, "как писать между бегин-енд?", то зачем меня цитировать? Вообще когда 2 автора (ide и вы, или вы и ваш коллега) лезут редактировать один файл - это источник проблем. Вы либо сами пишите main, либо доверьте генератору. Если доверили генератору - то не следует туда соваться. Если сами хотите писать - то запретите генератору генерить. Если вообще не хотите, чтобы ide вам что-то генерировала - не используйте ide (ну или не используйте генератор кода).
-
вопрос был "Как вызывать из main.c, если в main.c ни чего не писать?". И вы предлагаете решение этого вопроса - писать в main.c.
-
ещё можно отметить галку "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 - ни кто у вас ни чего ни когда не выпилит.
-
Ни как. Я в конфигурации добавил FreeRTOS. Автоматически создается одна задача defaultTask. Отмечаешь её "Code Generation Options" как "As weak". В своем отдельном файле определяешь свою функцию StartDefaultTask пишешь свой while(1) - profit!!!
-
между END и BEGIN должно затереться. Так задумано. Между BEGIN и END не должно. А зачем что-то писать в сгенерированных файлах между END и BEGIN? По хорошему, так вообще не следует ни чего писать в сгенерированных файлах.