Как сымитировать программные модули [ 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
Если всё с нуля, один и для себя, то конечно дело вкуса
Но если или не с нуля, или не один, или не только для себя, то совсем другое дело )