Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Остальное » Программные модули в си


Программные модули в си

Сообщений 1 страница 15 из 15

1

Как сымитировать программные модули [ http://kvodo.ru/pascal-custom-modules.html ] на си?
Какие варианты?

2

Не помню паскаля со времен турбо-паскакаля, но разве это не тоже самое, что и библиотеки статические - т.е. .lib+.a в сях?

3

Модули - это структура программы, заданная прямо в текстах самой программы, а не в "проектах", 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)

4

Ух, Ē! Я вспомнил свой первый курс (21 год назад, блин!), когда у нас был один семестр "информатики" и там нам долбили паскуалий зачем-то (хотя его должны долбить школьникам, а студентов надо уже с С и ассемблером знакомить).
Вот я купил себе книженцию, изучил быстренько базовый курс и клепал модули на парах, чтобы упростить кое-какие задачи... Но это было давно и неправда.
Чем-то похоже на попытку упростить работу со сниппетами.
В С это делается либо через включение файлов, лежащих "где-то там", либо путем оформления своих сниппетов в библиотеку. Я, намучившись с нулевым и первым вариантами, решил перейти ко второму и оформить сниппеты в библиотеку. Теперь проблем нет. Тем более, что я опакетил библиотеку с некоторыми другими своими велосипедами, и при необходимости "все само обновляется".

5

И получается каша
Вот например взгляни со стороны [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>:

6

Структура как структура.. Это ж микроконтроллеры! Здесь не получится просто взять, и написать библиотеку! Каждый раз что-то меняется, поэтому работает только самый тупой способ: копировать в кучу все файлы и править по существующей конфигурации.
Я уж стараюсь проектозависимые вещи в два файла выносить (hardware.[ch]), но не всегда это получается. Особенно если нужны DMA и т.п.: пришлось бы уж очень дофига макросов писать...
Вот для компьютера обиблиотечивание своих сниппетов оправдано.

7

Не замечаешь, что микроконтроллеры [те же stm32] очень быстро превращаются в компьютеры?
Какое-то время ещё можно будет цепляться за младшие модели, но я думаю, что недолго )

8

Я сложные не использую. Не вижу смысла: зачем убиваться со всякой дрянью вроде lwip и ртосью, если можно взять МК попроще, а для сетевых решений и вычислений использовать одноплатник за 1000 рублей? А на одноплатнике стоит человеческий линукс и никакого гемора!
Хотя, не исключаю, что лет через 10 появятся монстры вроде современных старших STM'ок при цене в 50 центов за камень... Но и тогда они просто будут заменой старым. Я уж точно влезать в абдуринство не собираюсь!

9

Модульность будет и в микроконтроллерах, развитие языка пример того же питона.

10

Модули в clang - https://clang.llvm.org/docs/Modules.html
С объяснениями чем плохи хедеры и инклюды

11

HHIMERA написал(а):

... лет через 200...  Дотянешь??? Нет???

В основных компиляторах модули в каком-то виде уже есть, потому что они будут в С++20. Через годик можно ждать в gcc для ARM, пока модули тестят в отдельной ветке.

Отредактировано Reflector (2019-07-17 11:28:28)

12

Модули - это структура программы, заданная прямо в текстах самой программы, а не в "проектах", make-файлах и т.п. дополнительных причиндалах

Всё-таки в турбо паскале он компилировался в .tpu и был по сути аналогом библиотеки статической. Разве что без .h обходилось дело. Что касается makefile, вложений или автоматического разрешения зависимости - так это просто зависит от системы сборки. Просто для C даже в рамках одной платформы их много разных. А в паскале она была "встроена" в конкретный пакет с компилятором. Не вижу если честно принципиальной разницы со статическими либами .lib/.a, кроме наличия .h в сях.

13

У турбо паскаля и других модульных языков нет системы сборки, нет линкера
Для их компиляторов программа - это множество файлов, а не один файл, как для компиляторов си
Они работают с файлами программы [модулями] на уровне синтаксиса языка

Вообще само понятие "система сборки" - нонсенс и анахронизм, в этом си уродует мозги не меньше бэйсика )

Отредактировано vt (2019-07-17 19:36:49)

14

А по мне наоборот больше гибкости получается и удобства. Но видимо это чистой воды "вкусовщина".

15

Если всё с нуля, один и для себя, то конечно дело вкуса
Но если или не с нуля, или не один, или не только для себя, то совсем другое дело )


Вы здесь » Микроконтроллеры » Остальное » Программные модули в си