|
возможно ли на Си, объединить биты регистров портов микроконтроллера |
|
|
|
 |
Ответов
|
Jun 14 2009, 20:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Меня как-то никогда не смущало написать пару десятков inline функций с осмысленными названиями, чтобы абстрагироваться от портов полностью. Код static inline void hal_SetRTS0(void) { PORTG |= (1 << RTS0); }
static inline void hal_ClrRTS0(void) { PORTG &= ~(1 << RTS0); }
static inline void hal_SetDTR0(void) { PORTG |= (1 << DTR0); }
static inline void hal_ClrDTR0(void) { PORTG &= ~(1 << DTR0); }
static inline void hal_PutRTS0(U8 val) { if (val) hal_SetRTS(); else hal_ClrRTS(); }
static inline void hal_PutDTR0(U8 val) { if (val) hal_SetDTR(); else hal_ClrDTR(); }
static inline U8 hal_GetCTS0(void) { return (PINE & (1 << CTS0)) != 0; }
static inline U8 hal_GetDCD0(void) { return (PINB & (1 << DCD0)) != 0; }
static inline U8 hal_GetDSR0(void) { return (PINB & (1 << DSR0)) != 0; }
static inline U8 hal_GetRI0(void) { return (PINB & (1 << RI0)) != 0; } .... А уже потом где надо, эти функции с осмысленными названиями назначать структурам: Код typedef struct tagFLOW_CONTROL { U8 enabled; // flow control enabled (check CTS before transmitting)
// acquiring signals cbs void (*On_DCD_Up)(struct tagFLOW_CONTROL *pCtrl); void (*On_CTS_Up)(struct tagFLOW_CONTROL *pCtrl); void (*On_DSR_Up)(struct tagFLOW_CONTROL *pCtrl); void (*On_RI_Up)(struct tagFLOW_CONTROL *pCtrl);
// losing signals cbs void (*On_DCD_Down)(struct tagFLOW_CONTROL *pCtrl); void (*On_CTS_Down)(struct tagFLOW_CONTROL *pCtrl); void (*On_DSR_Down)(struct tagFLOW_CONTROL *pCtrl); void (*On_RI_Down)(struct tagFLOW_CONTROL *pCtrl); void (*set_rts_cb)(U8 val); void (*set_dtr_cb)(U8 val); U8 (*get_cts_cb)(void); U8 (*get_dsr_cb)(void); U8 (*get_dcd_cb)(void); U8 (*get_ri_cb)(void); } TFLOW_CONTROL, *PFLOW_CONTROL;
...
#if (UART1_FULL_RS232) uart_con.u1_rs232_control.set_dtr_cb = hal_PutDTR0; uart_con.u1_rs232_control.set_rts_cb = hal_PutRTS0; uart_con.u1_rs232_control.get_cts_cb = hal_GetCTS0; uart_con.u1_rs232_control.get_dsr_cb = hal_GetDSR0; uart_con.u1_rs232_control.get_dcd_cb = hal_GetDCD0; uart_con.u1_rs232_control.get_ri_cb = hal_GetRI0;
uart_con.u1.pCtrl = &uart_con.u1_rs232_control; Kernel_SetTask( u1_DispatchRemoteFlowCtrlEvents, 5, TASK_PERIODIC); #endif Зачем нужны всякие макросы и прочая фигня для работы с портами то?
|
|
|
|
|
Jun 14 2009, 21:28
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zltigo @ Jun 15 2009, 00:16)  А вместо декларируемого HAL для "объекта" получена просто заумная работа с отдельными битам  . HAL у меня не декларирует непосредственно объекты (объекты описываются уже в соответствующих им файлах). HAL у меня отделяет программу от МК. (Двухступенчатый HAL получается). В примере выше, TFLOW_CONTROL описан не в HAL, а в uart.h, т.к. это объект связанный с UART'ом. Если мне нужно включить реле1 то я предпочту написать hal_RelayOn(); если зажечь зеленый светодиод, а не красный и не желтый. hal_GreenLedOn(); вместо SET_BIT( PORT_HZx, PIN_HZx); CLR_BIT( PORT_HZy, PIN_HZy); или других извратов. В свою очередь, это дает возможность, легко управлять временем. Например отключить реле __через 2 секунды__ после включения, я могу сразу же при включении реле: hal_RelayOn(); Kernel_SetCb( hal_RelayOff, 2000, SEMA_NULL); Ну и полностью забыть о GPIO портах как о классе, вне HAL. Цитата Вы не одиноки , а заумные HAL пишут с неменьшим "успехом" и на макросах. на макросах такая конструкция hal_RelayOn(); Kernel_SetCb( hal_RelayOff, 2000, SEMA_NULL); непрокатит.
|
|
|
|
|
Jun 14 2009, 22:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(defunct @ Jun 15 2009, 00:28)  если зажечь зеленый светодиод, а не красный и не желтый.
hal_GreenLedOn();
вместо
SET_BIT( PORT_HZx, PIN_HZx); CLR_BIT( PORT_HZy, PIN_HZy); Ровным счетом никаких отличий  Вы написали "десяток функций" для дергания пином с разными именами, кто-то напишет десяток макросов с разными именами, кто-то опишет десяток дефайнов для макросов а-ля Волков.. На самом деле из всех этих вариантов самый правильный скорее всего будет тот, кто банально содержит минимум разных букв. Зачастую меня более всего устраивает и такое самое простое и незатейливое: Код #define P0B_SPI0_FSEL0 BIT22 #define P0B_SPI0_FSEL1 BIT31 #define IOSET_SPI0 IO0SET #define SPI0_SEL_MASK (P0B_SPI0_FSEL1|P0B_SPI0_FSEL0) .... IOSET_SPI0 = SPI0_SEL_MASK; И даже для тех-же светодиодов уровень абстакции может, и я считаю- должен, быть заметно выше, нежели ON/OFF void led_mode( Led_e led, Led_mode_e mode ); led_mode( LED_RED, LM_FLASH_1 ); Задается какой светодиод и десяток режимов миганий. Несклько десятков строк в отдельном файле посященном светодиодам. В файле без всяких слишком многоэтажных наворотов пишется, все , что нужно. Такой HAL, я понимаю.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 14 2009, 22:25
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zltigo @ Jun 15 2009, 01:00)  Зачастую меня более всего устраивает и такое самое простое и незатейливое: Код #define P0B_SPI0_FSEL0 BIT22 #define P0B_SPI0_FSEL1 BIT31 #define IOSET_SPI0 IO0SET #define SPI0_SEL_MASK (P0B_SPI0_FSEL1|P0B_SPI0_FSEL0) .... IOSET_SPI0 = SPI0_SEL_MASK; А если проц поменялся? У меня это просто: hal_SPI0_Prepare(); Цитата(singlskv @ Jun 15 2009, 01:14)  А может Вашему кернелу уже работать с объектами а не с отдельными сущностями ? Вы о чем? Какие отдельные сущности? Kernel работает с ___функциями____ которые описывают ___любые___ действия любых объектов. Цитата совсем не уловил почему countdown счетчик для пина должен принципиально отличаться от таково же для модема ? Блин... дак ничем он и не отличается.
|
|
|
|
Сообщений в этой теме
another_one возможно ли на Си Jun 13 2009, 16:50 sergeeff Никак Jun 13 2009, 17:59 DpInRock Вы всегда смотрите, как именно ваши фантазии будет... Jun 13 2009, 19:38 another_one Цитата(DpInRock @ Jun 13 2009, 23:38) Вы ... Jun 13 2009, 22:17 SSerge Для читаемости можно оформить доступ к битам в раз... Jun 13 2009, 22:49 sergeeff Почитайте современные книги, которые всячески сове... Jun 14 2009, 00:20 zltigo Цитата(sergeeff @ Jun 14 2009, 03:20) Поч... Jun 14 2009, 05:17 Herz Цитата(sergeeff @ Jun 14 2009, 02:20) Поч... Jun 14 2009, 06:47  SSerge Цитата(Herz @ Jun 14 2009, 12:47) Такие к... Jun 14 2009, 10:21   Dog Pawlowa Цитата(SSerge @ Jun 14 2009, 13:21) Но, р... Jun 14 2009, 10:49    sergeeff Цитата(Dog Pawlowa @ Jun 14 2009, 14:49) ... Jun 14 2009, 10:55     Dog Pawlowa Цитата(sergeeff @ Jun 14 2009, 13:55) Это... Jun 14 2009, 11:07    aaarrr Цитата(Dog Pawlowa @ Jun 14 2009, 14:49) ... Jun 14 2009, 11:35     Dog Pawlowa Цитата(aaarrr @ Jun 14 2009, 14:35) очень... Jun 14 2009, 17:09      aaarrr Цитата(Dog Pawlowa @ Jun 14 2009, 21:09) ... Jun 14 2009, 17:16       Dog Pawlowa Цитата(aaarrr @ Jun 14 2009, 20:16) зато ... Jun 14 2009, 17:36        aaarrr Цитата(Dog Pawlowa @ Jun 14 2009, 21:30) ... Jun 14 2009, 17:41         Dog Pawlowa Цитата(aaarrr @ Jun 14 2009, 20:41) Вы им... Jun 14 2009, 17:55          aaarrr Цитата(Dog Pawlowa @ Jun 14 2009, 21:55) ... Jun 14 2009, 17:59        sergeeff Цитата(Dog Pawlowa @ Jun 14 2009, 20:36) ... Jun 14 2009, 17:48         Dog Pawlowa Цитата(sergeeff @ Jun 14 2009, 20:48) Ну ... Jun 14 2009, 18:04          sergeeff Цитата(Dog Pawlowa @ Jun 14 2009, 21:04) ... Jun 14 2009, 18:41           ReAl Цитата(sergeeff @ Jun 14 2009, 21:41) 2. ... Jun 14 2009, 20:46            sergeeff Цитата(ReAl @ Jun 14 2009, 23:46) где ... Jun 15 2009, 06:31             Dog Pawlowa Цитата(sergeeff @ Jun 15 2009, 09:31) кни... Jun 15 2009, 06:44              sergeeff Цитата(Dog Pawlowa @ Jun 15 2009, 09:44) ... Jun 15 2009, 07:11             ReAl Цитата(sergeeff @ Jun 15 2009, 09:31) 2. ... Jun 15 2009, 08:03              sergeeff Цитата(ReAl @ Jun 15 2009, 11:03) Так зна... Jun 15 2009, 08:33        zltigo Цитата(Dog Pawlowa @ Jun 14 2009, 20:36) ... Jun 14 2009, 19:13      sergeeff Цитата(Dog Pawlowa @ Jun 14 2009, 20:09) ... Jun 14 2009, 17:29    SasaVitebsk Цитата(Dog Pawlowa @ Jun 14 2009, 13:49) ... Jun 15 2009, 08:24     zltigo Цитата(SasaVitebsk @ Jun 15 2009, 11:24) ... Jun 15 2009, 10:43      SasaVitebsk Цитата(zltigo @ Jun 15 2009, 13:43) ...и ... Jun 17 2009, 08:57 sergeeff Мне представляется, что:
1. Есть программисты - од... Jun 14 2009, 10:27 KRS На С++ можно с помощью перезагрузки операции присв... Jun 14 2009, 10:59 sergeeff А почему все макросы в одном h-файле можно помести... Jun 14 2009, 11:16 MrYuran Я бы сделал так:
#define UP(port, bit) port |=... Jun 14 2009, 11:34 another_one Цитата(MrYuran @ Jun 14 2009, 15:34) Я бы... Jun 14 2009, 18:41  sergeeff Цитата(another_one @ Jun 14 2009, 21:41) ... Jun 14 2009, 18:59   aaarrr Цитата(sergeeff @ Jun 14 2009, 22:59) Еже... Jun 14 2009, 19:05   zltigo Цитата(sergeeff @ Jun 14 2009, 21:59) Неб... Jun 14 2009, 19:16    sergeeff Цитата(zltigo @ Jun 14 2009, 22:16) Прост... Jun 14 2009, 19:38     Dog Pawlowa Цитата(sergeeff @ Jun 14 2009, 22:38) ...... Jun 14 2009, 19:54      aaarrr Цитата(Dog Pawlowa @ Jun 14 2009, 23:54) ... Jun 14 2009, 20:05     zltigo Цитата(sergeeff @ Jun 14 2009, 22:38) Сог... Jun 14 2009, 20:11 aaarrr Да-да, copy-paste, в первый раз и "char... Jun 14 2009, 19:14     singlskv Цитата(defunct @ Jun 15 2009, 01:28) на м... Jun 14 2009, 21:39      defunct Цитата(singlskv @ Jun 15 2009, 00:39) а п... Jun 14 2009, 21:46       singlskv Цитата(defunct @ Jun 15 2009, 01:46) Пото... Jun 14 2009, 21:54        defunct Цитата(singlskv @ Jun 15 2009, 00:54) про... Jun 14 2009, 22:13         singlskv Цитата(defunct @ Jun 15 2009, 02:03) Вы ч... Jun 14 2009, 22:14         Dog Pawlowa Цитата(defunct @ Jun 15 2009, 01:13) Вы м... Jun 15 2009, 05:37          defunct Цитата(Dog Pawlowa @ Jun 15 2009, 08:37) ... Jun 15 2009, 06:46       singlskv Цитата(defunct @ Jun 15 2009, 02:25) Блин... Jun 14 2009, 22:30        defunct Цитата(singlskv @ Jun 15 2009, 01:30) Ну ... Jun 14 2009, 22:37       zltigo Цитата(defunct @ Jun 15 2009, 01:25) А ес... Jun 15 2009, 07:05 ReAl ====================
Кстати, об исходной теме и пр... Jun 14 2009, 20:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|