|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 6 2017, 05:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Apr 6 2017, 07:52)  А ни разу не сталкивались, когда при очередной модификации кода (через 10*N месяцев) в 16 бит переменной (поле структуры) нечаянно пытались освоить биты >16? Ну, да, действительно - гораздо разумнее весь код загромождать избыточной информацией ради гипотетической штучной проблемы с переполнением "через 10*N месяцев". В таком случае, предлагаю в название переменной добавлять не только ее тип, а еще секцию памяти, где она лежит, область видимости, дату ее создания и еще бог знает что  Кроме шуток, существует весьма полезная вещь - sizeof, или для более продвинутых: (1 << ( sizeof(...)*8 ) ) - 1
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 6 2017, 05:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Alechek @ Apr 6 2017, 09:52)  А ни разу не сталкивались, когда при очередной модификации кода (через 10*N месяцев) в 16 бит переменной (поле структуры) нечаянно пытались освоить биты >16? нет, ни разу. никогда к битам не обращяюсь напрямую типа a |= (1 << 24); Только через дефайны. a |= STATE_A; хидере пишу что-то типа такого Код #define STATE_A (1<<0) #define STATE_B (1<<1) #define STATE_C (1<<2) ... #define STATE_x (1<<15)
uint16_t state = STATE_C | STATE_B | STATE_F; определяя новый дефайн всегда помню(проверяю) про размерность переменной. это раз.... и второй подход - это битовые поля. например так Код typedef union { struct { uint16_t enterTrip :1; // uint16_t exitTrip :1; uint16_t printTrip :1; uint16_t printCheck1 :1; uint16_t printCheck2 :1; // uint16_t printCheck3 :1; // uint16_t printTest :1; uint16_t setTime :1; uint16_t getTime :1; uint16_t setLine :1; uint16_t getLine :1; uint16_t setColor :1; uint16_t getColor :1;
uint16_t rezerv :3; //uint16_t rezerv2 :16;//для выравнивания в 32 можно раскоментировать } flags; uint16_t word;//если раскоментирован флаг rezerv2, то закоментировать //uint32_t word;//если раскоментирован флаг rezerv2, то раскоментировать } FlagsKL; .... FlagsKL flagsKL; flagsKl.word = 0;//сброс всех бит в ноль flagsKL.flags.printCheck2 = 1;//установить бит 4 в 16-ти битной переменной при таком написании вообще пофиг в каком месте биты стоят.... printCheck2 - 4-ый или 8-ой. при таком подходе... не возможно ошибиться и вылезти за размер 16 бит. бывало такое Код uint8_t asd; .... asd = 300; но это быстро ловиться... если это поле структыры, то компилятор подсвечивает подсказку - как это поле структыры обявлено, тип этой переменной
|
|
|
|
|
Apr 6 2017, 05:30
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(juvf @ Apr 6 2017, 08:24)  и второй подход - это битовые поля А, если еще компилятор поддерживает безымянные объединения, то получается полный феньшуй: Код typedef struct // Frame { struct // Supported only 11-bit ID (CAN 2.0A) { UNSIGNED1 nodeId : 7; UNSIGNED1 functionCode : 4; } cobId;
bool isRemoteTransmitionRequest;
UNSIGNED8 dataLength; union { UNSIGNED8 dataPayload08[8]; UNSIGNED16 dataPayload16[4]; UNSIGNED32 dataPayload32[2]; UNSIGNED64 dataPayload64; }; } Frame; nodeId при присвоении проверяется на граничные значения внутри соотв. метода соотв. класса, т.е. в одном месте, а не размазаны по всему коду ... functionCode вообще может принимать лишь фиксированные значения: Код // Peer-to-Peer objects of the CANopen Predefined Master/Slave Connection Set const struct { UNSIGNED8 nodeControl; UNSIGNED8 emergencyAndSynchronize; UNSIGNED8 timeStamp; UNSIGNED8 TPDO1; UNSIGNED8 RPDO1; UNSIGNED8 TPDO2; UNSIGNED8 RPDO2; UNSIGNED8 TPDO3; UNSIGNED8 RPDO3; UNSIGNED8 TPDO4; UNSIGNED8 RPDO4; UNSIGNED8 TSDO; UNSIGNED8 RSDO; UNSIGNED8 errorControl; } peerToPeerObject = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14}; вот так используется: Код void CANopenSlave::operator << (Frame & rxFrame) { // Broadcast Message if (rxFrame.cobId.nodeId == 0) { if (rxFrame.cobId.functionCode == peerToPeerObject.nodeControl) { processNodeControl(rxFrame); ...... зы. это коду выше более 5 лет (если не больше), но по-прежнему легко читается...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 6 2017, 17:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(juvf @ Apr 6 2017, 10:24)  нет, ни разу. никогда к битам не обращяюсь напрямую типа a |= (1 << 24); Только через дефайны. a |= STATE_A; Счастливчик. Только увы, биты можно освоить и простым сложением величин... А потом долго не втыкать, почему же с = a+b не работает...Или с = a - b, если b > a... А все было бы гораздо прозрачней, если usC = iA - iB Еще интересней случаи, когда Data = N; вместо *Data = N; а с *pData = N; сделать ошибку куда сложней.
|
|
|
|
|
Apr 6 2017, 20:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Apr 6 2017, 20:19)  А все было бы гораздо прозрачней, если usC = iA - iB © "Ежики кололись, но все равно ели кактус"  Цитата *pData = N; сделать ошибку куда сложней. Только что попробовал такую конструкцию: Код int value = 10; int * pointer; .... pointer = value; Тут же получил от компилятора (keil) по носу: error: #513: a value of type "int" cannot be assigned to an entity of type "int *" Но это проглатывает: Код int * pointer; pointer = 0; Хотя я никогда так не пишу, а использую вместо нуля эту штуку (ее нет в С++): Код #undef NULL #define NULL ((void*)0) ..... pointer = NULL; Тогда при попытке присвоить обычной переменной эту NULL: Код int value; .... value = NULL; получим от компилятор опять щелчок по носу: error: #513: a value of type "void *" cannot be assigned to an entity of type "int" зы. Честно, прям дикости какие-то вы тут пишите У меня никогда не было подобных проблем с неправильным присвоением указателя и т. п. Может, это связано с тем, что трачу уйму времени на предварительно проектирование кода ... не знаю, но факт в том, что в своем коде никогда не шифрую тип переменной в ее названии и никогда от этого не было проблем, а лишь наоборот. Хотя раньше указатели я именовал, но не шифровками типа - "p" или "ptr", а с полностью - с припиской "Pointer" в конце названия. В данный момент указателей практически нет, кроме редких случаем в низкоуровневых драйверах да и то крайне редко, всегда стараюсь избегать указатели в коде. Это несложно, т. к. пишу под плюсами, поэтому использую ссылки, а не указатели. Так безопаснее да и код читается лучше, т.к. нет "->".
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 03:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Alechek @ Apr 6 2017, 22:19)  Еще интересней случаи, когда Data = N; вместо *Data = N; Ха..... Да и без ругони компилятра не допускаю такие ошибки.... Не знаю почему... Такое руки сами не напишут... Это даже детской ошибкой не назвать.... ))) ps а ещё есть ссылки. они более защищены, чем указатель. Цитата Честно, прям дикости какие-то вы тут пишите +100 Цитата Только увы, биты можно освоить и простым сложением величин... какие биты у величин? Биты - это флаги. Вам нужно проверить 3, 6 и 18 флаг по "И", проверяйте if(a & ((1<<3) | (1<<6) | (1<<18)){} по "ИЛИ" - проверяйте if(a | ((1<<3) | (1<<6) | (1<<18)){} Грамозко, непонятно, требует комента? сделайте дефайн #define IS_PRESENT_ALL ((1<<3) | (1<<6) | (1<<18)) if(a | IS_PRESENT_ALL){} а также a |= (1<<7);//выставить 7-ой бит a &= ~(1<<19);//сбросить 19-ый бит Какое у битов сложение? Если нужно переменную в 2 и более бита - используйте битовые поля, обращайтесь к ним как к простым переменным.
|
|
|
|
|
Apr 7 2017, 06:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Сергей Борщ @ Apr 7 2017, 08:38)  Там "из коробки" специально для этого есть nullptr. Это относится лишь к компиляторам, которые поддерживают C++11. В ARM-компиляторе (Keil) есть частичная поддержка C++11, nullptr в его редакторе подкрашивается, это удобно )) "Из коробки" не заработает, нужно обязательно включать опцию компилятора "--cpp11". Но обязательно возьму на вооружение! Спасибо Цитата(Alechek @ Apr 7 2017, 09:32)  Не у всех так получается. Неправда - у всех это получается, ничего тут сложного нет. А дело, возможно, в другом - не все хотят учится и переучиваться  Цитата А люди еще бывает работают в команде. Тем более! Логичнее приучить всю команду сразу писать правильно, создав свод правил или использовать готовые, как тут уже писали,. Ведь на то она и команда, чтобы следовать единым и удобным для всех правилам, а не писать каждый как хочет! Придется все же выбрать: общие правила (законы) или "ежики кололись, но продолжали есть кактус" (повторяюсь) Цитата А еще бывает, люди пишут код, который потом будут массово пользовать другие (как те же библиотеки stm32). Какое странное оправдание .. .
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Apr 7 2017, 11:50)  Какое странное оправдание ... Ладно, последняя попытка Не все пишут на С++ и С++11 Те же библиотеки stm32 написаны на С. А ему пофиг на Код int value = 10; int * pointer; .... pointer = value;
|
|
|
|
|
Apr 7 2017, 07:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Apr 7 2017, 10:18)  Не все пишут на С++ и С++11 Это тут ни при чем. Я использую C-библиотеки stm32 в C++. Неразрешимых проблем не было. Цитата Те же библиотеки stm32 написаны на С. А ему пофиг на Код int value = 10; int * pointer; .... pointer = value; Так смените свой компилятор на нормальный, которому это не пофиг! Или покопайтесь в настройках компилятора, чтобы он ругался на такие вещи хотя бы warning-ми. Честно слово, как дети малые ... зы. Скажите, при сборке всего проекта вы сразу добиваетесь, чтобы не было ни одного warning-а или откладываете это на потом?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 09:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Alechek @ Apr 7 2017, 11:32)  Forger, juvf, вы сильно зацикливаетесь на своем коде. Я рад за вас, что вы сразу пишете идеальный код. Не у всех так получается. А люди еще бывает работают в команде. А еще бывает, люди пишут код, который потом будут массово пользовать другие (как те же библиотеки stm32). Я не зациклен. Я предложил свой стаил. Он не единственно верный. Гугл стайл мне не понравился... тип переменной в имя сувать - тоже мне не по вкусу. раньше вроде так писали int *pName; Сечас..... посмотрите другие стайлы.... мой стаил гавно? посмотрите гугл, Qt,.... посмотрите исходники Linux - это пуре СИ. Цитата Те же библиотеки stm32 написаны на С. А ему пофиг на иаровски СИШНЫЙ компилятр не скомпилировал такое, ругнулся Код int *i; i = 200; gcc тоже такое не проглотит. Не нужно нормальный компилятор. мне кажется не один компилятор такое не проглотит. Или я ошибаюсь? Какой компиллер такое проглитит? Я не пишу идеальный код сразу и правильно.... но мне эти р не нужны. Более того, они мне мешают. Если вам с ними комфортно, с ними меньше ошибок и быстрее пишется - ни кто вам не запрещяет ставить р.
|
|
|
|
|
Apr 7 2017, 09:31
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата иаровски СИШНЫЙ компилятр не скомпилировал такое, ругнулся Код int *i; i = 200; Отцы, вам самим не смешно такие примеры приводить? Позвольте зацитировать первооснователей (K&R): int х = 1, у = 2, z[10]; int *ip; /* ip - указатель на int */ip = &x; /* теперь ip указывает на х */ y = *ip; /* у теперь равен 1 */ *ip =0; /* х теперь равен 0 */ выделено мной.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|