打印
[程序源码]

你把UML用在mcu或者linux开发上面了吗?

[复制链接]
13870|120
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 keer_zu 于 2014-5-12 11:26 编辑

linux内核中充满了面向对象的思想,mod本身就体现了面向对象的思想,所有的驱动程序或者其他内核功能都可以模块的形式被‘打入’(加载insmod)内核。模块的加载、卸载、接口的定义等等,无不体现面向对象的思想。
     同样是C语言的应用,基于有限资源环境下的嵌入式应用完全可以通过UML对系统进行建模(不要说你不会就排斥它,都是学出来的,当年用惯汇编的人,觉得C也看不懂,转过来就不想再回去了/极个别除外,linus开始也用汇编,当他开始转向C的时候,他惊叹工作效率之高,当然他排斥C++或许有一定道理)
     
用结构体去实现一个类是很轻而易举的事情,在此基础上实现类的关联也非难事。当然继承有点繁琐,记得《设计模式》的作者也建议少用继承,不过用继承实现接口类还是很有用的。用C实现面向对象有几个理由:
                     1. 很多时候,编译器不支持C++,特别是针对微处理器的。
                     2. C++有看不见的手,不在你掌控之下的‘小动作’有些时候再嵌入式环境下是难以容忍的。
                        同时这些看不见的操作本身是占有资源的,这在很多嵌入式环境下也无法容忍。


    基于面向对象的设计方法,今天已经很成熟了。它没有必要和面向对象的设计语言绑定,其实用汇编也可以实现面向对象的设计,只是麻烦些而已,设计思想就是设计思想,不要将他等同为语言,这往往是我们初接触者的认知误区。
     
至于怎么从需求分析中得到系统的类结构,这个目前还没有软件能自动做到,你筛选出来的类,以及类与类之间的关系是否更完美,完全取决于你对面向对象的理解,以及你对系统本身的理解,以及你拥有的设计经验,这个是长期实践总结的结果,所以一个优秀的嵌入式架构师是很难得的。
   
你真正开始迈入这个门槛后,你一定再也不想回到过去堆砌代码的时代,如果你能随心所欲使用‘设计模式’,你将体会到这样做的好处,你将乐此不疲。。。。
    记住,这才是你做为代码工作者的目标:你是一位设计人员,你是一位工程师,而不是代码的堆砌者,你不是一位‘匠人’。


相关帖子

沙发
keer_zu|  楼主 | 2014-5-7 10:39 | 只看该作者
不要老是强调没有操作系统的环境多么特殊,其实操作系统也就是让你多了一个小伙伴,它为你提供了虚拟的多任务环境,管理了内存,管理了其他资源,并且通过一些库提供了方便的接口。有没有他,你的程序依然是一个独立的整体。不要过分强调什么裸奔,一点都不好玩。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2014-5-7 10:43 | 只看该作者
把list.h这个在linux内核里面到处被使用的文件,稍加修改,用在你的mcu上,或者其他有系统时候的环境,是挺方便的。再把UML用上,体验一把:分析->设计->实施->测试有序得周而复始带来的快感。你不再是一个代码的堆砌者,你不是一位匠人。你是一个设计师,你是一个工程师。一切都要规范,然后在规范下随心所欲。。。。。。这才是艺术。。。。

使用特权

评论回复
地板
keer_zu|  楼主 | 2014-5-7 10:55 | 只看该作者

利用类图描述你的架构

使用特权

评论回复
5
keer_zu|  楼主 | 2014-5-7 11:01 | 只看该作者
或者使用状态机图

使用特权

评论回复
6
keer_zu|  楼主 | 2014-5-7 11:06 | 只看该作者
或者使用部署图
构建你最初的框架

使用特权

评论回复
7
keer_zu|  楼主 | 2014-5-7 11:10 | 只看该作者
需求分析阶段,用例图为你描述了你的软件的外部试图。是你和客户(或者行业专家)沟通的桥梁。

使用特权

评论回复
8
keer_zu|  楼主 | 2014-5-7 20:58 | 只看该作者
这么好的东西,竟然没人一起探讨。

使用特权

评论回复
9
lxyppc| | 2014-5-7 22:12 | 只看该作者
个人觉得用c++会更清晰一些

使用特权

评论回复
10
keer_zu|  楼主 | 2014-5-8 09:46 | 只看该作者
首先,很多mcu的编译器不支持C++
其次,C++背后有编译器帮你做的事情,占用资源多,不可控,对于某些资源很有限的MCU很要命。
再次,真因为有“看不见的手”,可能会引入我们需要的行为,而损害其他性能,如实时性。

使用特权

评论回复
11
keer_zu|  楼主 | 2014-5-8 09:54 | 只看该作者
再者,面向对象是一种设计思想,应该是目前相对好的设计思想。它与语言没有必然的关系,只能说C++直接支持了某些面向对象特性,c没有。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
dong_abc + 6
12
keer_zu|  楼主 | 2014-5-8 10:00 | 只看该作者
上面类图里面几个基本类的实现。

1.socket通信:

typedef struct sub_socket_comm{
/********** socket ************/
        struct _tcp_sockets tcp_sock;
//        int socket;

/************* buf *************/
        PARA_BUF_QUEUE_T *send_frame_q;
        TCP_BUF_QUEUE_T *tcp_recv_buf_q;
        pthread_mutex_t recv_q_mutex;
//        unsigned char copy_count;

        char *buf;      /* recv buffer */
        size_t bufsize; /* allocated size of buf */
        size_t buflen;  /* current length of buf */
        char *sendbuf;  /* send buffer */
        size_t sendbufsize;
        size_t sendbuflen;

/********** threads ************/
        unsigned char is_recv_thread_alive;
        unsigned char is_send_thread_alive;
        SDL_Thread *recv_thread;
        SDL_Thread *send_thread;
        cmd_handler_t *cmd_handler;

/*********** connection manager **************/
        int (*create_connection)(struct sub_sock_para *sub_para,struct sub_socket_comm *sub_sock);
        int (*destory_connection)(struct sub_socket_comm *sub_sock);
}sub_socket_comm

使用特权

评论回复
13
keer_zu|  楼主 | 2014-5-8 10:01 | 只看该作者
2.Uart下行通信:


typedef struct uart_commx{
        DpUart_t uartx;
        char *send_frame;
        unsigned int send_len;
        //unsigned char *recv_frame;
        //unsigned int recv_len;
        unsigned char is_thread_alive;
        SDL_Thread *thread;
        struct list_head cyclic_query_list_head;
        pthread_mutex_t cyclic_lock;
        //SDL_mutex *mutex;
        pthread_mutex_t mutex;
#if 0
        PARA_BUF_QUEUE_T *uart_request_q;
#endif

        int (*init)(struct uart_commx *uart,unsigned int i);
        int (*deinit)(struct uart_commx *uart,unsigned int i);
        int (*send_and_recv)(void *uart,unsigned char *,unsigned int,unsigned int *);
        int (*add_cyclic_query)(struct uart_commx *uart,EVENT_ELEM_T *event,unsigned char com_no);
        int (*del_cyclic_query)(struct uart_commx *uart,EVENT_ELEM_T *event,unsigned char com_no);
        int (*add_up_data_item)(void *uart,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
        int (*del_up_data_item)(void *uart,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
}uart_commx_t;

使用特权

评论回复
14
keer_zu|  楼主 | 2014-5-8 10:02 | 只看该作者
3. UART接口
typedef  struct DpUart{
        int fd_p;
        /*** dev ***/
        char *uart_dev_path;
        int uart_flags;
        /*** set ***/
        int speed;
        int nDatabits;
        int nStopbits;
        int nParity;
        int c_cc_vtime;
        int c_cc_vmin;
        /*** operation ***/
        int (*UartOpen)(struct DpUart *uart);
        int (*UartClose)(struct DpUart *uart);
        int (*UartRecv)(int fd, char *buf, int len);
        int (*UartSend)(int fd, char *buf, int len);
}DpUart_t;

使用特权

评论回复
15
keer_zu|  楼主 | 2014-5-8 10:03 | 只看该作者
4.CAN通信:
typedef struct can_comx{
        can_bus_t can;
        char *send_frame;
        unsigned int send_len;
       
        unsigned char is_thread_alive;
        unsigned char is_independent_thread_alive;
        pthread_mutex_t mutex;

        SDL_Thread *thread;
        SDL_Thread *independent_thread;

        PARA_BUF_QUEUE_T *answer_q;

        _BUF_QUEUE_T *h_elem_q;
        _BUF_QUEUE_T *packet_elem_q;

/********** recv hlist ***********/
        struct recv_hlist_head *recv_head_array_ack;
        unsigned int recv_head_array_ack_len;

        struct recv_hlist_head *recv_head_array_req;
        unsigned int recv_head_array_req_len;

        struct list_head frame_list;

       
        int (*init)(struct can_comx *canx,unsigned int i);
        int (*deinit)(struct can_comx *canx,unsigned int i);
        int (*send_and_recv)(void *canx,unsigned char *,unsigned int com_no,unsigned int *);
        int (*add_up_data_item)(void *canx,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
        int (*del_up_data_item)(void *canx,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
}can_comx_t;

使用特权

评论回复
16
keer_zu|  楼主 | 2014-5-8 10:04 | 只看该作者
5.CAN接口:
typedef struct can_bus{
        char *dev_name;
        int socket;
        unsigned int ID;
        fd_set rset;

        pthread_mutex_t mutex_recv;
        pthread_mutex_t mutex_send;

        int (*init)(struct can_bus *can,unsigned int);
        int (*deinit)(struct can_bus *can);


        int (*recv)(struct can_bus *can,struct can_frame *frame);
        int (*send)(struct can_bus *can,can_data_t  *data);
}can_bus_t;

使用特权

评论回复
17
keer_zu|  楼主 | 2014-5-8 10:07 | 只看该作者
6.对CAN通信和UART通信泛化出的抽象类。

typedef struct dev_com{
        char *send_frame;
        unsigned int send_len;
        pthread_mutex_t mutex;
        pthread_mutex_t mutex_s;
        void *EslNode;
        void *spec_com;
       

        int (*send_and_recv)(void *comx,unsigned int,unsigned char *,unsigned int *);
        int (*add_up_data_item)(void *comx,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
        int (*del_up_data_item)(void *comx,struct esl_attribute_node *EslNode,unsigned char event_type,unsigned short scan_esl_addr);
}dev_com_t;

使用特权

评论回复
18
keer_zu|  楼主 | 2014-5-8 10:08 | 只看该作者
7.上行通信协议:


typedef struct aioi_proto{
        esl_attr_hlist_t *esl_attr;
        func_hlist_t *fun_h;

        dev_com_t *commx_array;

        esl_protocol_t *esl_proto;
        PARA_BUF_QUEUE_T *para_buf_q;
       
       
        int (*init)(struct aioi_proto *,unsigned int,unsigned int);
        int (*deinit)(struct aioi_proto *);
        int (*process)(struct aioi_proto *,const char *recv,unsigned int recv_len,char *send,unsigned int *send_len);
        int (*get_up_data)(struct aioi_proto *,char *ret_buf,unsigned int *);
}aioi_proto_t;

使用特权

评论回复
19
keer_zu|  楼主 | 2014-5-8 10:11 | 只看该作者
8.下行通信协议

typedef struct dev_protocol{
        func_hlist_t *fun_h;  //cmd_build_func
       

        int (*init)(struct dev_protocol *,unsigned int);
        int (*deinit)(struct dev_protocol *);
        int (*cmd_build)(short id,char cmd,const char *para,unsigned int para_len,char *frame,unsigned int *frame_len);
        int (*cmd_analysis)(const char *frame,unsigned int len,int *ret,char *para);
}dev_protocol_t;

使用特权

评论回复
20
keer_zu|  楼主 | 2014-5-8 10:12 | 只看该作者
9.设备属性描述类

typedef struct dev_attr_hlist{
        struct dev_attr_head *head_array;
        unsigned int head_array_len;

        int (*init)(struct dev_attr_hlist *,unsigned int);
        int (*deinit)(struct dev_attr_hlist *);
        int (*add_node)(struct dev_attr_hlist *,struct dev_attribute_node *);
        int (*del_node)(struct dev_attr_hlist *,unsigned int);
        struct dev_attribute_node *(*get_node)(struct dev_attr_hlist *,const unsigned int);
}dev_attr_hlist_t;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1322

主题

12293

帖子

53

粉丝