Листая старю тетрадь
Jun. 19th, 2012 05:55 pmМного хороших советов по хорошему стилю программирования водится в интернетах, так же несколько хороших уроков преподал мне камрад
В общем, тоже дам один. Ковыряю тут свой код, примерно как ребёнок ковыряет говно палочкой. И вижу там такую конструкцию:
...
//Тут некоторая мелкая процедурка в коде, например приём символов по UART
if (некое условие)
{
...
//*****************************************************
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
PORTA=0xFF; //НИКОГДА ТАК НЕ ДЕЛАТЬ!!!!!!
//*****************************************************
...
}
Хотел подсветить код, но не нашёл где. Сайт http://tohtml.com/c/ , где я делал это внезапно сломался на этом коде
Это было сделано в момент отладки, чтобы мигать светодиодом. А байт записывается, чтобы не думать на какой ноге порта висит светодиод. Так делать нельзя никогда!!! Лучше сделать во первых дефайн определяющий порт, дефайн определяющий ногу, и менять состояние только ОДНОГО пина!
В результате после написания программы я благополучно забыл об этой адовой конструкции, и уже было собирался переносить код в другой проект, как обнаружил этот капец.
Эта адова конструкция находится только в одном месте программы, и условие выполняется крайне редко. Но если выполнится, то выпадает гора глюков. Что сильно может опечалить оконечного юзверя.
no subject
Date: 2012-06-19 02:20 pm (UTC)no subject
Date: 2012-06-19 02:31 pm (UTC)flag.h:
extern int my_global_flag; // объявление
inline int flag_is_set() {
return (my_global_flag == 1);
}
inline void flag_set() {
my_global_flag = 1;
}
inline void flag_clear() {
my_global_flag = 0;
}
...
flag.c:
int my_global_flag; // определение
1. В любой момент можно вставить отладку и отследить изменение глобальной переменной.
2. inline компилятор вставляет по месту при оптимизации. то есть нет потерь быстродействия на вызов функции.
PS: пусть камрады меня поправят, если я гоню. ;)
no subject
Date: 2012-06-19 03:02 pm (UTC)2. если это не static inline, и вызов из другого .с, компилятор может спокойно положить на этот инлайн.
no subject
Date: 2012-06-19 03:06 pm (UTC)Вот как, например, ты собираешься из прерываний что-то делать без глобальных переменных? или из асмовских файлов? функции вызывать, которые будут возвращать флаг?
no subject
Date: 2012-06-19 03:13 pm (UTC)#define MY_PORT PORTA
#define MY_DIR DDRA
#define MY_IN PINA
И дальше оперировать ими.
no subject
Date: 2012-06-19 03:15 pm (UTC)2. inline-функции в h-файле.
no subject
Date: 2012-06-19 03:36 pm (UTC)no subject
Date: 2012-06-19 04:28 pm (UTC)no subject
Date: 2012-06-19 07:35 pm (UTC)no subject
Date: 2012-06-19 07:35 pm (UTC)>>Лучше сделать во первых дефайн определяющий порт, дефайн определяющий ногу, и менять состояние только ОДНОГО пина!
no subject
Date: 2012-06-19 07:43 pm (UTC)no subject
Date: 2012-06-19 07:49 pm (UTC)LED_ON
LED_OFF
SPI_SEND_BYTE
и тыды. И в коде юзать только их. Тогда проект вообще можно будет в два счета перетащить на другую архитектуру. Поменяв только эти дефайны.
no subject
Date: 2012-06-20 07:27 am (UTC)У меня по УАПП приходят четырёхбайтовые комманды, формата два байта комманда, и два байта номер:
Например
ON01 - включить релюшку первую
или
RD12 - прочитать состояние 12 релюшки
Есть комманды, которые применимы ко всем релюшкам, типа:
OAOA - выключить все релюшки.
Фишка в том, что номера релюх по сути должны быть не привязаны к номерам портов. Как наиболее оптимально сделать разбор этих комманд, и включать релюшку именно с этим номером?
Комманды микроконтроллеру:
ON ** - On ** switch
OF ** - Off ** switch
OA OA - Off All Switch
RD ** - Read status switch
RA RA - Read status ALL switch
HS HS - Signal the presence - просто запрос присутствия, есть ответ присутствия.
У меня реализована ещё проверка по таймауту, что если не принято было всё в течении определённого времени, то приёмка обнуляется и выдаётся ошибка. Но конструкция вышла аховая.
no subject
Date: 2012-06-20 11:10 am (UTC)no subject
Date: 2012-06-20 04:33 pm (UTC)Называется "Совершенный код" Макконнелла. Каждому программисту строго рекомендую читать.
Как правильно кто-то говорил: написать хороший код и написать плохой код занимает одно и то же время.
no subject
Date: 2012-06-20 04:36 pm (UTC)no subject
Date: 2012-06-20 05:12 pm (UTC)no subject
Date: 2012-06-20 06:02 pm (UTC)#define Relay1_ON {Relay1PORT |=1<<relay_bit1; Relay1DDR |=1<<relay_bit1}while(0) #define Relay1_OFF {Relay1PORT &=~(1<<relay_bit1); Relay1DDR |=1<<relay_bit1}while(0) и юзай их в свое удовольствие. Надо будет поменять - они все у тебя в одной куче. Взял и поменял.
no subject
Date: 2012-06-20 06:03 pm (UTC)no subject
Date: 2012-06-21 05:17 am (UTC)no subject
Date: 2012-06-21 05:21 am (UTC)no subject
Date: 2012-06-21 05:23 am (UTC)no subject
Date: 2012-06-21 05:24 am (UTC)К сожалению нет, даже гитхаб не юзаем :)
no subject
Date: 2012-06-21 07:08 am (UTC)Я просто загнал несколько команд в пустой while, чтобы юзать их как макрос.
no subject
Date: 2012-06-21 03:33 pm (UTC)no subject
Date: 2012-06-21 03:36 pm (UTC)Впрочем, надо просто курнуть гитхаб
no subject
Date: 2012-06-21 05:53 pm (UTC)