-
Постов
1 610 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент juvf
-
Плавный переход 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; Разворачивай хоть что, хоть в чем. -
Плавный переход 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. Может код и будет работать правильно, а это трабла только с дебагом.... Кто с таким сталкивался? Что с этим делать?
-
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Да, восстановил и Wiring и там же восстанавливаются меню View. Спасибо. -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
в каком общем меню? посмотрите ещё раз скрин 9-ки, посмотрите мой первый вопрос: Раньше на схемном редакторе, где-то на самом видном месте Как её вернуть назад установить в удобное место, как она была в AD9/AD15? у меня вид АД сейчас такой: Куда ткнуть и что перетащить, чтобы восстановить эти внопки и в виринг и в вью? -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
что теперь делать? как и куда подгрузить Default? -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Попытался настроить тулбар Wiring. Эту кнопку не могу найти. Попытался перенести её с меню View в Wiring - в результате она исчезла из меню View. Как её вернуть в Wiring и в View? -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
вот посмотрите, эта кнопка в 9-ке Вот эта кнопка в 16-ом Она была в 21-ом. Куда то делась. Как её вернуть? у меня нет её в Wiring-е. Как её туда вернуть? -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
у меня тоже не получилось. -
Altium 21.6 и выше
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
AD 21.4. Раньше на схемном редакторе, где-то на самом видном месте, была кнопка "Set net colors". Не знаю, что случилось, может где-то настройки тулбаров поменял, но этой кнопки не стало. Еле еле нашел её в меню View->Set Net Colors. Как её вернуть назад установить в удобное место, как она была в AD9/AD15? -
При попытке отладить/залить прогу из IAR в процессор получаю ошибку St-link + st8l051f3. IAR 3.11. На домашнем ПК всё работает. На рабочем ПК таже железка с тем же st-link - получаю "Couldn't find STM8L051F3 in the list of supported MCUs.". Ставил IAR с одного исходника. На рабочем ПК железка шьется/читается через STVP, через IAR не хочет. В этой ветке озвучивалась такая проблема. Кто с таким сталкивался? Как решить?
-
Обычно генераторы кода в начале файла пишут комент "Do not edit". В этом генераторе более демократичный подход и вам позволено писать вместе с генератором, но в секциях бегин-енд.
-
Спасибо за пример, лишний раз убедился, что порядок include не должен влиять на собираемость проекта. Есть ещё примеры? что то там про аппаратные вычислители.... razrab83 говорит Вы его отсылаете к стандарту. Причем тут стандарт? а зачем? Если стандарт не определяет знаковость char - зачем к нему отсылать? Можно отослать к ГК РФ или к правилам ПДД - они тоже этого не утверждают. А кто или что интерпретирует char как знаковый или беззнаковый при компиляции? КОМПИЛЯТОР!!! (кто-то скажет архитектура... я бы поспорил, но не буду) Что-бы там не писали в стандарте, в ГК РФ, в ПДД или в этих ваших справочниках и учебниках, сколько бы вы тут постов не писали и какие бы пункты из стандарта не копипастили - мануал на компилятор IAR говорит ровно то, что делает IAR компилятор. By default, the compiler interprets the plain char type as unsigned. Интерпретирует plain char как unsigned. Пусть по стандарту 3 типа, пусть эти типы независимы, пусть будет 5 типов, пусть 2.... пусть даже стандарт утвердит char == signed char - компилятор будет интерпретирует plain char как unsigned. И не правы вы в том, что набрасываете на вентилятор ....., вместо того чтобы открыть и/или отослать к мануалу.
-
хотел добавить, не успел.... а как вы прокомментируете мануал на с\с++ иара так весь сыр бор начался с того, чтобы в IDE не ставить галку "char is unsigned". Весь спор не за сухую абстракцию стандартов, а за то, как пишу программы. И исполняемый код выполняет АЛУ, которое char обработает как знаковое или нет. От этого будет зависить результат работы программы, а не от пунктов и формулировок в стандарте.
-
а как вы тогда прокомментируете мой пример, приведённый выше, в котором plain char компилятор рассматривает как signed char?
-
а в чем баг? Ну хорошо.... пусть будет баг... открываем любой справочник по С++, например этот и видим Тип char Размер в байтах 1 Диапазон -128...127 Тип signed char Размер в байтах 1 Диапазон -128...127 Тип unsigned char Размер в байтах 1 Диапазон 0...255 mycpp.ru - это вообще кто? они хоть раз открывали стандарт с++? в печку этот справочник Открываем Полный справочник по C++ (2015) Автор: Герберт Шилдт в первоисточнике Type Typical Size in Bits Minimal Range char 8 −127 to 127 unsigned char 8 0 to 255 signed char 8 −127 to 127 Наверно Герберт Шилдт тоже не читал стандарт С++. даже достал такой древний букварь по СИ ...... диапазон char от -127 до 128. Немудрено, что многие программисты с/с++ считают, что char по дефолту знаковый.
-
Да, это 3 различных типа. см пример dimka76. Но тем не менее компилятор что си, что с++, определяет какой будет char без указания знаковости. Если вам мануал от IAR на компилятор с/с++ - это не показатель, то вот пример... x86, gcc, c++. По умолчанию char знаковый. дополнительные указания компилятору не даю, галки не ставлю. Ещё раз - это компиялтор с++, а не си. for(char i = -50; i<50; i++) ; Код собирается без ошибок и предупреждений и работает как следует. Теперь поправим цыфирьки for(char i = 0; i<150; i++) ; Собирается с ворнингом warning: comparison is always true due to limited range of data type [-Wtype-limits] for(char i = 0; i<150; i++) ~^~~~ программа выполняется и зависает в это цикле for. а вот такой код int max = 150; for(char i = 0; i<max; i++) ; собирается без предупреждений и зависает в for. и если кто-то написал такое и у него это работало там, где plain char воспринимался как unsigned - то там всё работает. а пересобери там, где plain char == signed char, молча зависнет. И это всё на компиляторе с++ (на си будет такой же результат.... наверно)