EC修炼之道—代码架构

来源:互联网 发布:单片机基础李广弟 编辑:程序博客网 时间:2024/06/05 07:40

         EC就是笔记本电脑上的一个嵌入式控制器。作为一个主板软件开发人员,一般说EC,就是EC固件程序。

         想要做好EC,首先要懂代码架构。这个东西说简单就简单,说困难也困难,要有人帮忙点破,然后一切都会OK。我刚到现在的这家公司,一个同事说,他做EC,经常会有很多奇奇怪怪的问题反复出现。后来,我才了解,他没有在专业主板团队做EC的经验,又得不到EC厂商的技术支持,所以对EC代码架构不了解。我比他幸运,因为我刚做EC的时候,台湾的EC工程师JIMMY每月都会有一周的时间到大陆出差,帮客户解决问题。有一天下午,我拉着JIMMY,帮我培训了一个下午(算我半个老师了),感谢JIMMY帮我打下了一个还算不错的基础。当时陪他来我们公司的那个大陆工程师都不耐烦了,但JIMMY仍然耐心地帮我培训。听说他去了联发科,祝愿他能发展得更好。

 

         个人认为,EC的整个代码架构,应该分为4个部分:1,初始化部分;2,运行时中断服务函数;3,运行时Dispatch中断处理函数;4,运行时任务,即在TIMER中断处理函数中加的轮询代码。

 

1 初始化

         不管是EC,还是其它的系统软件,代码最开始的部分总是初始化。初始化各个功能模块,让其符合代码架构的需要和平台功能模块的需要。

         一般来讲,初始化代码主要做如下几个事情:将中断服务函数与中断入口地址对应起来;设置好堆栈,为C环境做准备;初始化RAM为0;初始化各个模块,包括GPIO,中断控制单元,PWM,AD/DA,PS2,Timer,SMBUS等;设置看门狗;etc

 

2 运行时中断服务函数

         代码执行过程中,会有各种硬中断及软中断来中断CPU的运行,请求CPU的控制权。CPU会实时跳入到某个中断服务函数中,执行相应的例程。中断服务函数代码段,一般应该尽量短,最好设置一下中断标志,立即跳出。这样一方面不会打断别的程序太久,另一方面也让其它中断服务函数有公平的执行机会。

 

3 运行时Dispatcher中断处理函数

         在EC初始化完成后,如果不进入低功耗状态,那么EC就需要正常Dispatcher各个中断处理函数。中断服务函数一般不会做太多工作,大部分工作都会交给中断处理函数来执行。

   Dispatcher各个中断处理函数是靠轮询的方式来实现的,这样可以保证各个中断处理函数都有可能被执行,又可以保证一定的优先级。只要把重要的中断处理函数放在前面轮询,就可以保证其优先调用。具体做法,可以查看各个厂商的EC代码,在main()函数里,都会有while(TRUE)类似的语句,在它括起来的代码段里,会有查询各个标志位,然后执行相应函数的代码。

        

4 添加运行时任务

         为什么用EC,那是因为只要有电,EC的控制权就一直在EC固件手中。X86的CPU就不一样了,一跑进操作系统,BIOS再想做些事情就特别困难。

         我们总是需要EC来检测平台的一些状态,比如电池电量,CPU温度,风扇转速,按键状态,平台功耗等。这时,我们就需要在Timer里,加入自己的代码,每隔一段时间,代码就会被执行一次。

 

         以上就是我所提炼的EC的整个代码架构了。在我接触的EC里,华邦,ITE,ENE都是这种架构,只有瑞萨的EC代码有点例外。不过我还是觉得上述代码架构比较好。

前年,我带的一个学生要用一款单片机做温控模块。我便给他搭了一个软件架构,让他往中断处理函数里面加代码。他说我怎么做得这么快,一个晚上的时间就帮他搭好了。现在他也在做EC,肯定不再认为我CODE能力好了。因为那套温控模块的代码架构完全就是抄袭EC的思想(^_^),连脑子都不带转一下的。

 

0 0
原创粉丝点击