Как сымитировать программные модули [ http://kvodo.ru/pascal-custom-modules.html ] на си?
Какие варианты?
Программные модули в си
Сообщений 1 страница 15 из 15
Поделиться12019-07-12 09:33:50
Поделиться22019-07-13 09:28:18
Не помню паскаля со времен турбо-паскакаля, но разве это не тоже самое, что и библиотеки статические - т.е. .lib+.a в сях?
Поделиться32019-07-13 13:16:44
Модули - это структура программы, заданная прямо в текстах самой программы, а не в "проектах", make-файлах и т.п. дополнительных причиндалах
Вот попытка сымитировать модули на си - https://www.embedded.com/design/prototy … mming-in-C
Но это только одна сторона медали, вот другая - http://make.mad-scientist.net/papers/ad … eneration/
Нашёл ещё
https://www.icosaedro.it/c-modules.html
Отредактировано vt (2019-07-14 11:04:56)
Поделиться42019-07-15 21:19:38
Ух, Ē! Я вспомнил свой первый курс (21 год назад, блин!), когда у нас был один семестр "информатики" и там нам долбили паскуалий зачем-то (хотя его должны долбить школьникам, а студентов надо уже с С и ассемблером знакомить).
Вот я купил себе книженцию, изучил быстренько базовый курс и клепал модули на парах, чтобы упростить кое-какие задачи... Но это было давно и неправда.
Чем-то похоже на попытку упростить работу со сниппетами.
В С это делается либо через включение файлов, лежащих "где-то там", либо путем оформления своих сниппетов в библиотеку. Я, намучившись с нулевым и первым вариантами, решил перейти ко второму и оформить сниппеты в библиотеку. Теперь проблем нет. Тем более, что я опакетил библиотеку с некоторыми другими своими велосипедами, и при необходимости "все само обновляется".
Поделиться52019-07-16 10:09:26
И получается каша
Вот например взгляни со стороны [cflow] на структуру своего проекта
main() <int main (void) at main.c:176>: sysreset() StartHSE() hw_setup() <void hw_setup () at hardware.c:86>: gpio_setup() <inline void gpio_setup () at hardware.c:29>: CRH() CRL() NVIC_EnableIRQ() LED1_off() USBPU_OFF() usarts_setup() <void usarts_setup () at usart.c:169>: usart_setup() <void usart_setup (int n, uint32_t BRR) at usart.c:112>: CRH() CRL() NVIC_SetPriority() NVIC_EnableIRQ() SysTick_Config() SEND() USB_setup() <void USB_setup () at usb.c:73>: NVIC_DisableIRQ() nop() NVIC_EnableIRQ() iwdg_setup() <void iwdg_setup () at main.c:48>: USBPU_ON() dump_userconf() <void dump_userconf () at flash.c:223>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: get_userconf() <void get_userconf () at flash.c:127>: get_gooddata() <int get_gooddata () at flash.c:107>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: binarySearch() <int binarySearch (int l, int r) at flash.c:78>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: DBG() memcpy() GPS_send_start_seq() <void GPS_send_start_seq () at GPS.c:118>: DBG() write_with_checksum() <void write_with_checksum (const char *buf) at GPS.c:69>: usartrx() usart_getline() <int usart_getline (int n, char **line) at usart.c:42>: DBG() GPS_parse_answer() <void GPS_parse_answer (const char *buf) at GPS.c:150>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: cmpstr() <int cmpstr (const char *s1, const char *s2, int n) at str.c:31> checksum_true() <int checksum_true (const char *buf) at GPS.c:42>: getchr() <char *getchr (const char *str, char symbol) at str.c:45>: hex() <uint8_t hex (uint8_t n) at GPS.c:35> getchr() <char *getchr (const char *str, char symbol) at str.c:45>: set_time() <void set_time (const char *buf) at time.c:41>: atou() <inline uint8_t atou (const char *b) at time.c:33> usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: GPS_send_string() SEND() send_chksum() <void send_chksum (uint8_t chs) at GPS.c:58>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: hex() <uint8_t hex (uint8_t n) at GPS.c:35> newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: GPS_endline() LED_blink() LED1_blink() LED1_on() usartrx() usart_getline() <int usart_getline (int n, char **line) at usart.c:42>: DBG() transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: usb_proc() <void usb_proc () at usb.c:89>: USB_GetState() <uint8_t USB_GetState () at usb_lib.c:519>: EP_Init() <int EP_Init (uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, uint16_t (*func) (ep_t ep)) at usb_lib.c:344>: func() EP1_Handler() <uint16_t EP1_Handler (ep_t ep) at usb.c:36>: SET_VALID_TX() KEEP_STAT_RX() SET_VALID_RX() SET_STALL_TX() EP23_Handler() <uint16_t EP23_Handler (ep_t ep) at usb.c:48>: EP_Read() <int EP_Read (uint8_t number, uint16_t *buf) at usb_lib.c:508>: SET_NAK_RX() CLEAR_DTOG_RX() CLEAR_DTOG_TX() SET_STALL_TX() KEEP_STAT_TX() SET_VALID_RX() get_USB() <char *get_USB () at main.c:156>: USB_receive() <int USB_receive (char *buf, int bufsize) at usb.c:129>: EP23_Handler() <uint16_t EP23_Handler (ep_t ep) at usb.c:48>: EP_Read() <int EP_Read (uint8_t number, uint16_t *buf) at usb_lib.c:508>: SET_NAK_RX() CLEAR_DTOG_RX() CLEAR_DTOG_TX() SET_STALL_TX() KEEP_STAT_TX() SET_VALID_RX() CLEAR_DTOG_RX() SET_VALID_RX() SEND() parse_USBCMD() <int parse_USBCMD (char *cmd) at str.c:57>: USB_send() <void USB_send (char *buf) at usb.c:104>: USB_configured() <int USB_configured () at usb.c:155>: DBG() EP_Write() <void EP_Write (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:493>: EP_WriteIRQ() <void EP_WriteIRQ (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:474>: SET_NAK_RX() SET_VALID_TX() KEEP_DTOG_TX() KEEP_DTOG_RX() CMP() get_time() <char *get_time (curtime *Tm, uint32_t T) at time.c:72>: strcpy() get_millis() DBG() GETNUM() store_userconf() <int store_userconf () at flash.c:137>: DBG() erase_flash() <int erase_flash () at flash.c:171>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: DBG() USB_send() <void USB_send (char *buf) at usb.c:104>: USB_configured() <int USB_configured () at usb.c:155>: DBG() EP_Write() <void EP_Write (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:493>: EP_WriteIRQ() <void EP_WriteIRQ (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:474>: SET_NAK_RX() SET_VALID_TX() KEEP_DTOG_TX() KEEP_DTOG_RX() parse_cmd() <char *parse_cmd (char *buf) at main.c:72>: LED_off() LED_on() GET_BTN0() GET_BTN1() GET_PPS() getnum() <int getnum (const char *buf, int32_t *N) at usart.c:338>: SEND() addNrecs() <void addNrecs (int N) at flash.c:229>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: store_userconf() <int store_userconf () at flash.c:137>: DBG() erase_flash() <int erase_flash () at flash.c:171>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: DBG() newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: dump_userconf() <void dump_userconf () at flash.c:223>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: pin_toggle() pin_read() newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: USB_send() <void USB_send (char *buf) at usb.c:104>: USB_configured() <int USB_configured () at usb.c:155>: DBG() EP_Write() <void EP_Write (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:493>: EP_WriteIRQ() <void EP_WriteIRQ (uint8_t number, const uint8_t *buf, uint16_t size) at usb_lib.c:474>: SET_NAK_RX() SET_VALID_TX() KEEP_DTOG_TX() KEEP_DTOG_RX() NVIC_SystemReset() get_time() <char *get_time (curtime *Tm, uint32_t T) at time.c:72>: strcpy() get_millis() nop() usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: GPS_parse_answer() <void GPS_parse_answer (const char *buf) at GPS.c:150>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: cmpstr() <int cmpstr (const char *s1, const char *s2, int n) at str.c:31> checksum_true() <int checksum_true (const char *buf) at GPS.c:42>: getchr() <char *getchr (const char *str, char symbol) at str.c:45>: hex() <uint8_t hex (uint8_t n) at GPS.c:35> getchr() <char *getchr (const char *str, char symbol) at str.c:45>: set_time() <void set_time (const char *buf) at time.c:41>: atou() <inline uint8_t atou (const char *b) at time.c:33> parse_lidar_data() <void parse_lidar_data (char *txt) at lidar.c:27>: SEND() printu() <void printu (int n, uint32_t val) at usart.c:278>: usart_send() <void usart_send (int n, const char *str) at usart.c:87>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: u2str() <char *u2str (uint32_t val) at usart.c:255>: newline() <void newline () at usart.c:99>: usart_putchar() <void usart_putchar (int n, char ch) at usart.c:82>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>: transmit_tbuf() <void transmit_tbuf (int n) at usart.c:54>:
Поделиться62019-07-16 11:25:59
Структура как структура.. Это ж микроконтроллеры! Здесь не получится просто взять, и написать библиотеку! Каждый раз что-то меняется, поэтому работает только самый тупой способ: копировать в кучу все файлы и править по существующей конфигурации.
Я уж стараюсь проектозависимые вещи в два файла выносить (hardware.[ch]), но не всегда это получается. Особенно если нужны DMA и т.п.: пришлось бы уж очень дофига макросов писать...
Вот для компьютера обиблиотечивание своих сниппетов оправдано.
Поделиться72019-07-16 17:41:22
Не замечаешь, что микроконтроллеры [те же stm32] очень быстро превращаются в компьютеры?
Какое-то время ещё можно будет цепляться за младшие модели, но я думаю, что недолго )
Поделиться82019-07-16 23:59:30
Я сложные не использую. Не вижу смысла: зачем убиваться со всякой дрянью вроде lwip и ртосью, если можно взять МК попроще, а для сетевых решений и вычислений использовать одноплатник за 1000 рублей? А на одноплатнике стоит человеческий линукс и никакого гемора!
Хотя, не исключаю, что лет через 10 появятся монстры вроде современных старших STM'ок при цене в 50 центов за камень... Но и тогда они просто будут заменой старым. Я уж точно влезать в абдуринство не собираюсь!
Поделиться92019-07-17 04:08:26
Модульность будет и в микроконтроллерах, развитие языка пример того же питона.
Поделиться102019-07-17 10:28:18
Модули в clang - https://clang.llvm.org/docs/Modules.html
С объяснениями чем плохи хедеры и инклюды
Поделиться112019-07-17 11:27:37
... лет через 200... Дотянешь??? Нет???
В основных компиляторах модули в каком-то виде уже есть, потому что они будут в С++20. Через годик можно ждать в gcc для ARM, пока модули тестят в отдельной ветке.
Отредактировано Reflector (2019-07-17 11:28:28)
Поделиться122019-07-17 18:31:38
Модули - это структура программы, заданная прямо в текстах самой программы, а не в "проектах", make-файлах и т.п. дополнительных причиндалах
Всё-таки в турбо паскале он компилировался в .tpu и был по сути аналогом библиотеки статической. Разве что без .h обходилось дело. Что касается makefile, вложений или автоматического разрешения зависимости - так это просто зависит от системы сборки. Просто для C даже в рамках одной платформы их много разных. А в паскале она была "встроена" в конкретный пакет с компилятором. Не вижу если честно принципиальной разницы со статическими либами .lib/.a, кроме наличия .h в сях.
Поделиться132019-07-17 19:12:38
У турбо паскаля и других модульных языков нет системы сборки, нет линкера
Для их компиляторов программа - это множество файлов, а не один файл, как для компиляторов си
Они работают с файлами программы [модулями] на уровне синтаксиса языка
Вообще само понятие "система сборки" - нонсенс и анахронизм, в этом си уродует мозги не меньше бэйсика )
Отредактировано vt (2019-07-17 19:36:49)
Поделиться142019-07-17 20:08:34
А по мне наоборот больше гибкости получается и удобства. Но видимо это чистой воды "вкусовщина".
Поделиться152019-07-17 21:11:11
Если всё с нуля, один и для себя, то конечно дело вкуса
Но если или не с нуля, или не один, или не только для себя, то совсем другое дело )