本帖最后由 trochili 于 2016-1-4 14:10 编辑
由于临近毕业,论文压力山大,加上其它的杂事,一直没有连续的时间来学习一下飞鸟的trochili操作系统,这次就借着这个小红板来初体验一下。 先交代一下,自己没有真正玩过实时操作系统,此前只是大致了下UC/OS的书,所以本篇的理解可能会比较肤浅也可能会有错误地方,希望不吝赐教。 要玩板子,首先是搭建开发环境,以前都是用的IAR,这次为了玩系统,也必须要随大流装上keil-MDK了,不过以前51是在keil上调试的,所以倒也不算陌生。首先,安装程序,这里选了网上好下的MDK5.14版本,注意破解是必要的,否则编译时候就会报错。 第二步,根据论坛和群里看到的只言片语,凭着程序猿的直觉,安装GD的芯片支持包,这个在小红板附带的光盘里面都有,所以还是非常容易的: 其中第一个直接运行即可,后两个要通过keil来添加:
安完之后我们再来新建工程时,就不用担心找不到对应的单片机了: 为了节约时间,这里就不详述如何去一步步新建空工程、添代码了,我们直接找到飞鸟的trochili例程: 打开尝试编译一下,成功啦!而且也只有一个不重要的警告,可见飞鸟的操作系统不是随随便便拿来糊弄人的: 下载程序(GD-link驱动自动安装,WIN10系统),运行效果和板子刚拿来时一样。 下面开始进入正题,先看工程结构: 最上面是ARM的标准接口库,接着是GD的固件库,接着是板级支持包,再下面就是与trochili相关的操作系统核心文件了,由此可见飞鸟这个操作系统结构也还是很清晰的,这为后面研究奠定了良好基础。但是不解的是,再往下就集成了各种例程如线程、消息队列邮箱等,编译的时候是如何控制的?当前打开的是哪个例程?带着这些问题,继续探究代码。 首先,任意打开一个例程,随手选择了最下面的“example_board”,打开C文件,果然,程序一开头就有条件编译控制语句: 找到EVB_EXAMPLE的定义位置,在example.h文件里,找到了EVB_EXAMPLE的定义: 因此可以断定,当前工程编译的就是这个“example_board”例程了,至于上面的其它宏定义中的数字是什么含义(#defineCH9_TIMER_EXAMPLE (91)),留作后面再探究。 先找到main函数: Main函数中就调用了一个最简单的内核启动函数,里面有四个指针,查找对应代码可以看出,第一个是用户应用程序入口函数,第二个是CPU启动入口函数,第三个是评估板启动入口函数,第四个是评估板调试跟踪函数。 本例中,评估板启动配置了三个功能:串口1、LED、KEY, 而调试跟踪函数的作用也就是把字符串从串口一发出去。而在“AppSetupEntry”函数中,比较重要的就是对LED线程的初始化和线程的激活了,这一点非常重要,以后要定义自己的线程时,用同样的方法就可以了: 下面再看LED线程部分: 可以看到,LED基本线程非常简单,就是让LED3亮1s再灭1s,同时跟踪函数输出对应的“LED3ON”或“LED3OFF”,也就是我们在上电测试时从串口收到的数据。 再看另一分部函数,即按键中断处理函数部分: 该函数中重要的点有对按键值的扫描以及对键值的处理,当按键索引值可以被2整除时,就启动用户定时器(定时器时长为1000ms,在定时器初始化时被设定),否则就关闭用户定时器。再看对应的用户定时器回调函数: 可以看到,定时器回调函数的作用也是根据索引值能否被2整除来控制LED1或LED2的亮或灭。 为了验证对程序的理解是否正确,特地对板上的按键做了实验。果然,当按下KEY1时,板上的红灯(LED4就开始1s亮暗闪烁),再按一下,就保持在按下的状态;按KEY2时,板上的翠绿灯开始闪烁,验证了程序阅读的正确性。 到这里,对trochili实时操作系统的初体验就算结束了。非常公正的说,飞鸟操作系统结构清晰、理解容易、工程结构和代码风格都非常不错,注释完善,基本功能也非常完备,是初学者学习实时操作系统的上选! 附: 作为一个“发烧友”,不把板子的性能发挥到极致,实在是心有不甘,这里偷偷把系统的主频改为120M,来做一个小测试。 打开“system_GD32f20x.c”,将主频改为120M: 重新编译下载,这时问题来了,LED闪烁的频率明显比第一次要快了,可见系统的基本时钟源也跟随变化了,因此在调节系统时钟时,还需要把操作系统的基本时钟源也做更改。 再看串口部分,串口依然正常的收到了数据,只不过发送频率快了一些,因为外设的时钟源与系统核心不同,所以就没有出现这个问题了。 由于板子没有引出摄像头接口,所以原计划的视频监控系统无法实现了,现在就来做一个无线传感器网络环境监测系统吧,从zigbee模块接收数据,在屏幕上显示,并存放在SD卡中,这应该也是一个不错的系统吧。
|