-
Постов
1 564 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
juvf стал победителем дня 13 марта
juvf имел наиболее популярный контент!
Репутация
9 ОбычныйИнформация о juvf
-
Звание
Профессионал
Контакты
-
Сайт
Array
-
ICQ
Array
Посетители профиля
-
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
вот от куда ноги спора диалога растут. -
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
а причем тут строгая типизация? Вы, прежде чем кидаться словами, поймите, о чем речь идет, а потом уже будете обвинять других. Сбавьте обороты. -
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
это Вы не в ту степь ушли. А теперь напишите enum class En {FROST } и попробуйте тоже самое - int temp = FROST; 🙂 я сказал "int temp = FROST; нет ни какой разницы FROST - это дефайн или енум.". При чем тут различия между enum и enum class? Речь шла о том, что имя "FROST" писать как eFROST или как FROST? Разницы нет. -
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
Это Вы немного не поняли о чем я говорил. И причем тут проблемы енума и понимание того, каким методом была задана константа? -
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
что-то я действительно не понял. но я понял то, что Вы это сами не писали 😉 Написал. Компилятор выдал ошибку Error[Pe101]: "EN0" has already been declared in the current scope (�Hat line 32�h) myFile.cpp 36 Error[Pe101]: "EN1" has already been declared in the current scope (�Hat line 32�h) myFile.cpp 36 написал. И что? Что с этим дальше делать? Вы предлагаете int инициализировать типом A. А зачем? Теперь то, о чем я говорил. Допустим есть некий порог температуры. Автор программы библиотеки задает эту константу так: #define FROST 10 либо так enum {FORST = 10}; Сделал, отдал в продакшин. Теперь прикладной программист пишет свой код с использованием вашей библиотеки int temperature = FORST; //вот тут какая разница как в FORST попала 10? Тут прогер должен понимать, что создалась переменная типа int, и она инициализировалась значением 10. Это Эквивалент записи int temperature = 10; ps даже если очень жжет использовать enum class, очень хочется, но не хотите при каждом использовании кастовать, то закастуйте дефайном enum class A { EN0 = 10, EN1 = 20 }; #define FORST (static_cast<int>(A::EN0)) //так const int FORST2 = static_cast<int>(A::EN1); //ну или даже так int temp = FORST2 - FORST; //вот тут какая разница, как 10 и 20 попали/заменились на FORST и FORST2? эквивалент int temp = 10; Тут нужно понимать что в temp ляжет 10, которая вычислилась на этапе компиляции pps #define asd(m) (do(0){return 5*m;}) #define EN1 true #define TEMP2 asd(5) const int pi1 = 3; enum { ANGLE1 = pi1*10 + (EN1 ? TEMP2: 13)}; enum class A{ASD = ANGLE1, ASD2 = ANGLE1 + 6}; enum {QWE0 = static_cast<int>(A::ASD2), QWE1, QWE2}; #define POIU (QWE2 - 31) int angleOfHor = POIU; //в конечном счете это тоже самое, что и int angleOfHor = 32; Разворачивай хоть что, хоть в чем. -
juvf подписался на Проблема с CH32V003 , Плавный переход C -> C++ под МК и И снова CUBE IDE
-
Плавный переход C -> C++ под МК
juvf ответил Arlleex тема в Программирование
плюсую. int temp = FROST; нет ни какой разницы FROST - это дефайн или енум. нет ни какой разницы, с точки зрения конечного пользователя этой функции - она макрос, инлайн или обычная функция. Автор my_macro_func() принимает решение, как максимально эффективно её определить и решает сделать её макросом или функцией. Пользователя это не должно волновать. (более того, она вообще может быть и на асме определена, а может быть и из библиотеки взята, исходного кода которой у вас нет.) Тем более автор этой функции, может в любой момент переоформить её из макроса, в обычную функцию. Тогда Вам придется my_macro_func() переименовывать в my_func() - а это смена API. У пользователей посыпется сборка. мне казалось, что общепринятые правила, это имена функций и методов - с маленькойБуквы. см printf(), strlen(), open(), .... мне мешают нотации/префиксы/постфиксный. Я делаю все имена переменных/функцый - с маленькой, все имена типов/классов с большой. Наверно из Qt и FreeRTOS подчерпнул. Разделение слов - кэмл, без '_'. -
Тут скорее всего объявление не переменной, а переменных. Зачем в таком коде индекс у i? С логической точки зрения кода, что делается в case 1: - объявляется переменная i - определяется значением р[1] - Вычисляется r = a*i; С точки зрения читаемости кода индекс не нужен. Попробуйте собрать так int Tst1(int a, int *p) { int r = -1; switch (a) { case 0: int i; i = p[0]; r = a + i; break; case 1: int i; i = p[1]; r = a * i; break; case 2: int i; i = p[2]; r = a << i; break; } return r; } Получите ошибку: Error[Pe101]: "i" has already been declared in the current scope. Скобочки решают эту проблему. Можно конечно без скобок и без индексов так сделать int Tst1(int a, int *p) { int r = -1; switch (a) { case 0: int i; i = p[0]; r = a + i; break; case 1: i = p[1]; r = a * i; break; case 2: i = p[2]; r = a << i; break; } return r; } Соберётся и будет работать. Но это вообще какой-то зашквар. Под case 0: объявляется переменная, а под case 2: определяется.
-
typedef struct { uint8_t family; uint8_t code[MAXDEVICES_ON_THE_BUS]; uint8_t crc; } RomCode; // RomCode romCode;//можно проинициализировать вот так = {.family = 1, .crc = 0xCA}; void main(void) { for(;;) { asm("nop"); } }
-
добавить (NOLOAD) не в bss, а в те секции, которые не должны попасть в hex .SPIbufSection (NOLOAD): { *(.SPIbuf) } >Memory_B0 .RxDecripSection (NOLOAD): { *(.RxDescripSection) } >Memory_B1 .TxDescripSection (NOLOAD): { *(.TxDescripSection) } >Memory_B2 .RxarraySection (NOLOAD): { *(.RxBUF) } >Memory_B3 .TxarraySection (NOLOAD): { *(.TxBUF) } >Memory_B4 Ну и вроде как звёздочки не хватает. .SPIbufSection (NOLOAD): { *(.SPIbufSection*) } >Memory_B0 У меня так секция ОЗУ описана /* Memories definition */ MEMORY { CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K SDRAM (xrw) : ORIGIN = 0xC0000000, LENGTH = 4M } ..... .ARM.attributes 0 : { *(.ARM.attributes) } /* External RAM section */ .sdram (NOLOAD): { *(.sdram*); } >SDRAM
-
И снова CUBE IDE
juvf ответил Vlad_G тема в Cредства разработки для МК
я вот изначально и спросил - "как вы обновляетесь"? У меня куб автоматом не проверяет новую версию. ST качать в эту страну не дает. Приходится каждый раз через боль и унижение добывать новый инсталятор. Как обновить? Всё, нашел заветную кнопку. Вроде обновился до 1.14. Посмотрим как это будет работать. Спасибо. -
И снова CUBE IDE
juvf ответил Vlad_G тема в Cредства разработки для МК
вот вчера решил работу взять на дом. дома куб версии 1,0,1. Решил "обновить" до 1,13,2. Запустил инсталятор, он предложил установить в папку C:\ST\STM32CubeIDE_1.13.2. Но у меня установлен куб 1,0,1 в папку D:\soft\ST\STM32CubeIDE_1.0.1. Хмммм.... а где сообщение "Дорогой друг! Я обнаружил, что на Вашем ПК установлена версия КубИдэ в папку D:\soft\ST\STM32CubeIDE_1.0.1. Хотите эту версию обновить до версии 1.13.2?" Т.е. нужно руками инсталятору указать старую папку. Думаю - нееее... сейчас новые exe и dll накатит поверх старых, какие-то перепишет, какие-то добавит, какие-то не тронет и они останутся мусором. Какие-то старые плуги эклипса останутся... что потом со всем этим делать? Запускаю Панель управления->Программы и приложения. Ищу "куб1.0.1", жму "удалить".... Удалил. Папка D:\soft\ST\STM32CubeIDE_1.0.1 осталась. В ней куча всяких плагинов, каких-то файлов. Скорее всего это не от приложения остатки, а всякие плуги от эклипса. Удалил полностью эту папку и накатил новую версию в новое место. Вопрос: А если Вы в старое место устанавливаете новую версию, т.е. в ...\ST\STM32CubeIDE_1.11.0 ставите v1.14.0, то что у вас в Панель управления->Программы и приложения? Там обе версии? Что будет удалятся, если выбрать "куб1.11.0"->"удалить"? ой, конечно же это вопрос к виндузятникам. ps так может траблы в новой версией возникают в результате такого "обновления", при котором новая версия накатывается поверх старой? Там от старой версии останется плагин, который криво работает в новой и потом что-нибудь глючит. -
И снова CUBE IDE
juvf ответил Vlad_G тема в Cредства разработки для МК
а как вы обновляетесь? Я как-то давно заметил, что на ПК стоит две версии кубИде, и стоят они в разных папках. При очередном "обновлении", я деинсталировал старую версию и установил новую. Т.е. это не "обновление" а установка. Встала новая версия в ...\soft\...\STM32CubeIDE_1.13.2\STM32CubeIDE. Т.е. новая не чего не "переустанавливает", а ставит рядом другую версию. Или есть именно "update" текущей версии и в папке ...\soft\...\STM32CubeIDE_1.9\STM32CubeIDE до новой версии и инсталятор накати версию 1.13 в папку 1.9? -
И снова CUBE IDE
juvf ответил Vlad_G тема в Cредства разработки для МК
-
принял за априори, что код работает, а отображение переменной глючит. отладил код без дебага. всё рабтает. закрыл IDE. Сейчас ещё раз открыл IDE, пошагал в дебаге по с/с++... пока больше не наблюдаю этого эффекта. Все переменные в отладчике отображаются корректно. Вангую, что перезапуск IDE "вылечил" этот глюк.
-
Имеем МК CH32V003 + MounRever(с тулченом из коробки под Win). Вот два скриншота во время пошаговой отладки делаю шаг (step over) и получаю В 2-х словах в SpiCh32V003::writeRead() должно произойти чтение 2-х байт из SPI. В функцию передается аргумент outLen - кол-во байт для чтения из SPI. В начале функции перевожу CS в "0" на строке 155. outLen из 2 превращается в 16. Прерывания откл. До момента непосредственного чтения из SPI аргумент outLen становится 2356. Оптимизация в настройках проекта 0. Может код и будет работать правильно, а это трабла только с дебагом.... Кто с таким сталкивался? Что с этим делать?