This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

编写程序的时候,大家一般怎样封装一个设备模块?



分层搭建嵌入式系统是为了使结构更清晰,便于维护,提高复用性等等。那大家在写嵌入式程序的时候,尤其是编写设备驱动的时候,一般是怎样封装一个设备的?

类似于RTC实时时钟,比较容易一些,单独形成一个文件,在其中定义一些初始化、设置时间、读取时间、设置闹钟等等的函数,并实现它。主程序调用这几个函数就实现了这个设备的操作。

但是类似于串口这一类的,除了基本的设置,还需要交互数据等等,尤其是接收数据。如何封装才能使主程序更好的使用串口,避免全局变量的出现。

(在我的应用里,串口接收并响应指令。这些指令具有一定的格式,还有可能附带一定的参数。我希望指令的提取、校验等等都在封装好的模块里实现,主程序只关心指令的执行)。

过去的方案,在主程序与串口功能文件之间,总是不避免的出现全局变量,(也试着用过结构体、类似于windows下的句柄,效果也不好)大家有什么更好的建议?

  • 主程序与串口功能文件之间,总是不避免的出现全局变量,用到什么全部变量呢?串口初始化完毕后,直接传送参数就好了。

  • 完全可以封装在一个模块里。调用串口的时候用参数来传递变量和设置选项就好

  • xyz549040622 说:

    主程序与串口功能文件之间,总是不避免的出现全局变量,用到什么全部变量呢?串口初始化完毕后,直接传送参数就好了。

    串口接收的过程是在中断中完成的,利用状态机,从串口的数据流中将指令和各个参数提取出来(例如“shutdown ID2 force”包含了一个指令名,两个参数),放到串口功能文件的静态数组中,确切来说是一个二维数组或者指针数组(注意,这个过程都是在串口功能文件中完成的,串口中断函数也处于其中,整个过程没有主程序的参与)。只有成功接收了一个完成的指令后,才产生一个事件,退出休眠,唤醒主程序处理这个指令。

    事件、指令内容这些都成为了全局变量。

  • dirtwillfly 说:

    完全可以封装在一个模块里。调用串口的时候用参数来传递变量和设置选项就好

    你说的一般都是主程序主动调用模块文件中的函数。而有些事情是需要设备通知主程序的,是模块发起的,总不能让设备功能文件中的函数反过来调用主文件中的函数吧。

  • 可以参考TI TIVAWARE中库函数写法。