软件开发包(Package) 这部分将说明SDK51的软件包。完整的软件包开发目录中包含了SDK51的库工程及代码,样例工程及源码和随软件包发布的用户使用手册和开发日志等等。虽然SDK51本身是一个非常小的项目,但是功能设计及推进过程完全是按照专业的软件开发流程完成的,甚至使用了Git作为代码仓库进行维护。 目录结构(Directories) | | | | | | 存放SDK51_LIB库工程组织文件,子目录output存放编译生成的SDK51.LIB文件。 | | | | | | | | | | | | | | | | | | 段编译架构(Build Steps)SDK51工程的组织是基于二段编译的架构。首先,要编译一下SDK51的库工程,生成一个“SDK51.LIB”的库文件。然后才能编译各个样例工程,样例工程均包含这个公共的库文件。这是很多成熟软件的开发方式,使用库可以封装凌乱的内部实现(实际上SDK51的设计很清晰,代码也很规整),而且一次编译多次使用可以减少大量应用工程的编译时间,当然也能减少硬盘的存储空间。当然,还有保证代码一致性等等,总之,各种好处。 然而,实际发布的SDK51软件包中可能只包含已经预先编译好的SDK51.LIB库文件,而不再需要第一次编译。这倒不是说我小气不愿意开发SDK51实现的源代码,事实上51单片机的代码也什么可藏着掖着的。只是SDK51强调使用API进行开发,而不必纠结代码的实现过程。当然,如果在使用过程中遇到bug也可以给我写电子邮件,我会非常高兴别人帮我在我的代码里帮我抓虫子(Bug)的。这里可以保证SDK51是用百分之百的C51语言实现的,兼容所有的符合标准51单片机架构的芯片,而且也没有设计什么后门,可以放心使用并且不用担心泄漏你的私密信息。 样例程序摘要(Examples)跟随SDK51一同发布的若干个样例程序演示了SDK51中每一个API的使用场景,每个工程都是经过测试的,完全可以保证在你自己的板子上欢快地跑起来。 表1中列出了每个样例小程序用到的API。 | | | | | 第一个样例程序,演示基本的系统启动过程,然后通过串口发出欢迎信息,然后回显从串口接收到任何数据。 | SYSTEM_Init() SYSTEM_Start() UART_PutStr() UART_PutChar() | | 每隔一段时间通过串口发出一些字符串,说明延时函数的使用。 | | | 每隔一段时间通过串口发出一些字符串,说明延时回调的使用。第一次使用注册回调函数。 | | | | GPIO_SetPinsDir() GPIO_SetPins() GPIO_ResetPins() | | 使用GPIO读取一个外部按键的状态,根据与按键连接的引脚电平控制小灯的闪烁。 | | | 通过连接在INT0和INT1引脚上的两个按键触发外部中断事件,从而控制小灯的闪烁。 | INT0_InstallCallback() INT1_InstallCallback() |
用心的读者在做实验的时候必然会发现,编译样例工程会产生不少警告“Warning”,如图3所示。 图3 编译SDK51应用程序的警告 写程序的时候最好不要有“Warning”,因为它们可能是潜在的“Error”。但在这里我们忍了,为啥?因为C51的编译器实在是太笨了!大多数编译器在链接的时候可以自动排除未使用过的程序段,但是C51的就是不行,只是傻乎乎地说“XXX未使用”,然后还是把没有用到过的程序段打包到可执行文件中。同样,在图3中也可以看出,一个简单的小程序竟然使用了如此大的内部存储。 这里还要说明的是,SDK51其实说起来算是一个“玩具”级的开发平台,用于快速开发系统设计模型用的,主要在于简单好用,也就是强调用户体验。如果用所谓的“code size”和“performance”来评价SDK51,那它简直是一塌糊涂。而从实用的角度上看,片上存储资源只要能满足应用程序就够用。拼命的优化,留着那么多存储空间实在是浪费。绝大多数Android系统的运行平台配置比iOS系统高得不是一点半点,结果iOS运行的好好的,Android就总是当机。用户体验很重要! 无论如何,这里还是列出一个表格,让大家对SDK51的片上内存空间使用量有个印象。如果是系统资源非常紧缺或是存储空间有洁癖的开发者,好吧,SDK51并不是一个非常合适的选择。表2中的数据均为在没有启动任何编译器优化的实验结果。 这样的系统开销,对于现在市面上的流行的各种51单片机来说,基本上都可以胜任了。
|