Перейти к содержанию
    

razrab83

Участник
  • Постов

    383
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные razrab83


  1. 1 минуту назад, Forger сказал:

    как вы предлагаете понять где они закончились не зная заранее их объем?

    о каком протоколе говорим? Длинннна пакетов в бинарных протоколах известна ещё на этапе карандаша и черновика. Вы не сможете реализовать обмен данными, тем более защищать что-то там избыточным кодом, какие-то объемы данных, не зная размер этих объёмов. Допустим модбас: в каких-то пакетах есть размер данных, в каких-то нет. Но размеры всех всех пакетов известны на этапе проектирования. Пакет запрос чтения группы регистров - фиксированной длинннны. В пакете ответ чтения группы регистров - размер в пакете. Пакет теста - другой размер фиксированной длиннны. Все пакеты разной длинннны, но всё это можно посчитать в рантайме и без всяких пауз. Можете сунуть 100 пакетов в один приёмный буфер и он легко разгребается на отдельные пакеты и легко определяется длиннна каждого и соответственно вычисляется CRC.

  2. 1 минуту назад, Forger сказал:

    весь нюанс в том, чтобы понять где именно в пакете эта КС после данных, если заранее не известна длина этого поля данных до того, как они все пришли

    не очень понятно... зачем знать где конец данных, ДО того как они все пришли? Пришел пакет - вот длинна, получи и распишись. Не весь пришел пакет - жди когда прийдет весь.

     

    В бинарных протоколах всегда обычно известен размер пакета. Даже если размера нет в самом пакете.

  3. 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 сказал:

    иначе как понять где искать эту самую КС?

    в конце пакета )))

  4. 12 часов назад, tonyk_av сказал:

    Тут пробовали отключать?

    Нет. Я же говорю

    20 часов назад, razrab83 сказал:

    его конечно можно заглушить декертивами или настройками, или явным приведением типа к double. Но что-то не очень нравиться работать с double

    Придется пока смериться с double, а в дальнейшем возможно писать свой sprintf или использовать сторонний. Их уже навелосипедили не мало.

  5. 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) тоже нет ворнинга.

  6. В 27.01.2024 в 19:10, firstvald сказал:

    Не удается перепрыгивать к местам определения функций или переменных.

    в IAR - это лотерея. Ну не научился он это делать. Бывает, иногда сделает переход и даже попадет куда нужно. Но за частую не переходит. У вас какой-то месадж выдал. У меня молча закрывается контекстное меню и я остаюсь на том же месте, без каких либо сообщений. 2024 год на дворе, а IAR какие-то базовые операции навигации не умеет.

     

    Используйте внешний редактор внешнюю IDE: Eclipse, VS Code, .... для редактирования. Для отладки - IAR.

    • Thanks 1
    • Upvote 1
  7. 10 минут назад, AndyBig сказал:

    Заимейте привычку указывать после float-констант букву f

    а кто сказал что у меня нет такой привычки? написал для ПРИМЕРА. Изначально был такой пример
     

    float pi;
    sprintf(str, "%f", pi);

    Но подумал: щя найдется учитель, который будет учить инициализировать переменные перед использованием. Или спросит "а что такое str?". Немного доработал пример... но всё равно "занавеска" кому-то не угодила )). можно ещё и про snprintf(str, 100, ...) вспомнить для str[100].

     

    По делу, вопрос остался: почему в IAR 8,5 нет предупреждения, а в 9.4 есть в одном проекте есть предупреждение, в другом нет? Почему в iccarm есть предупреждение, а в gcc нет?

  8. //*.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.

  9. В 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 иар сможет нормально открыть и показать в этой кодировке.

  10. уважаемые плюсоводы, подскажите... файл *.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. На одном и том же МК.

     

     

     

  11. 12 минут назад, juvf сказал:

    готу Свойства-Дженерал-редактор-аннотация-серч резалтс....

    спасибо. помогло.

    4 часа назад, razrab83 сказал:

    Они перекрывают брейки. Пусть будут матчи в серче совпадения в окне поиска

    Да, кстати... а почему "брейки" не исправили? Или есть такое слово у Ожигова?

  12. 17 часов назад, dimka76 сказал:

    Вкладку результатов поиска закрыть.

    Не помогло. Помогло во вкладке поиска сделать "Remove all matches". Но мне не нужны эти стрелки в этом месте. Они перекрывают брейки. Пусть будут матчи в серче совпадения в окне поиска, но пусть они будут без стрелок в редакторе. Есть возможность настроить Eclipse так, чтобы результат поиска не выводил эти стрелки в редактор?

  13. В 25.08.2023 в 21:13, MaxiMuz сказал:

    Так а всетаки CubeIDE не умеет генерить хексы ?

    image.thumb.png.32286132fc69975ddfe5acea1b78f4bd.png

    В 25.08.2023 в 15:46, MaxiMuz сказал:

    Возникла проблем. Как залить прогу с помощью IDE в STM32VLDISCOVERY. 

    Я не обнаружил встроенной поддержки ST-Link.

    она там есть "изкоробки"

    Project->Propertias->Debug As->Debug configurations...  2Clik по STM32 C/C++ Application появится новая конфигурация отладки. По умолчанию ST-LINK

    image.thumb.png.a336ac719b1cc8516b3e818619f7b496.png

     

    • Thanks 1
  14. 2 часа назад, MaxiMuz сказал:

    Нет

    вот моё предложение:

    8 часов назад, razrab83 сказал:

    По хорошему, так вообще не следует ни чего писать в сгенерированных файлах. 

    Это не ответ на ваш первичный вопрос, это просто моё предложение. На это предложение вы озвучили вопрос:

    Цитата

    вызывать свой код как функцию из main ?

    На этот вопрос я ответил

    Цитата

    Ни как.

    Т.е. вопрос полностью: Как вызывать свой код как функцию из main, если в сгенерированные файлы, в том числе и в маин, ни чего не писать? Ответ полный: При таком подходе, т.е. если в сгенерировнные файлы ни чего не писать, то из майна ни как ни чего не вызвать. Можно вызвать из др. места свою функцию.

    На что codenamehawk предлагает решение писать между begin-end в сгенерированные файлы.

    5 часов назад, codenamehawk сказал:

    А если так

    Если вы отвечает на первый вопрос, "как писать между бегин-енд?", то зачем меня цитировать?

     

    2 часа назад, MaxiMuz сказал:

    Но сам факт того что ide решает за меня где мне вставлять свой код, мне не понравился.

    Вообще когда 2 автора (ide и вы, или вы и ваш коллега) лезут редактировать один файл - это источник проблем. Вы либо сами пишите main, либо доверьте генератору. Если доверили генератору - то не следует туда соваться. Если сами хотите писать - то запретите генератору генерить. Если вообще не хотите, чтобы ide вам что-то генерировала - не используйте ide (ну или не используйте генератор кода).

  15. ещё можно отметить галку "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 - ни кто у вас ни чего ни когда не выпилит. 

  16. 3 минуты назад, MaxiMuz сказал:

    вызывать свой код как функцию из main ?

    Ни как. Я в конфигурации добавил FreeRTOS. Автоматически создается одна задача defaultTask. Отмечаешь её "Code Generation Options" как "As weak". В своем отдельном файле определяешь свою функцию StartDefaultTask пишешь свой  while(1) - profit!!! 

  17. между END и BEGIN должно затереться. Так задумано. Между BEGIN и END не должно. А зачем что-то писать в сгенерированных файлах  между END и BEGIN? По хорошему, так вообще не следует ни чего писать в сгенерированных файлах. 

×
×
  • Создать...