10回答

0收藏

[分享] 国产MCU神作-GD207小红板第二弹——trochili操作系统初体验

GD32 GD32 10135 人阅读 | 10 人回复 | 2015-12-30

本帖最后由 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启动入口函数,第三个是评估板启动入口函数,第四个是评估板调试跟踪函数。
       本例中,评估板启动配置了三个功能:串口1LEDKEY
而调试跟踪函数的作用也就是把字符串从串口一发出去。而在“AppSetupEntry”函数中,比较重要的就是对LED线程的初始化和线程的激活了,这一点非常重要,以后要定义自己的线程时,用同样的方法就可以了:
下面再看LED线程部分:
   
可以看到,LED基本线程非常简单,就是让LED31s再灭1s,同时跟踪函数输出对应的“LED3ON”或“LED3OFF”,也就是我们在上电测试时从串口收到的数据。
       再看另一分部函数,即按键中断处理函数部分:
该函数中重要的点有对按键值的扫描以及对键值的处理,当按键索引值可以被2整除时,就启动用户定时器(定时器时长为1000ms,在定时器初始化时被设定),否则就关闭用户定时器。再看对应的用户定时器回调函数:
            
可以看到,定时器回调函数的作用也是根据索引值能否被2整除来控制LED1LED2的亮或灭。
为了验证对程序的理解是否正确,特地对板上的按键做了实验。果然,当按下KEY1时,板上的红灯(LED4就开始1s亮暗闪烁),再按一下,就保持在按下的状态;按KEY2时,板上的翠绿灯开始闪烁,验证了程序阅读的正确性。
到这里,对trochili实时操作系统的初体验就算结束了。非常公正的说,飞鸟操作系统结构清晰、理解容易、工程结构和代码风格都非常不错,注释完善,基本功能也非常完备,是初学者学习实时操作系统的上选!
附:
       作为一个“发烧友”,不把板子的性能发挥到极致,实在是心有不甘,这里偷偷把系统的主频改为120M,来做一个小测试。
       打开“system_GD32f20x.c”,将主频改为120M
    重新编译下载,这时问题来了,LED闪烁的频率明显比第一次要快了,可见系统的基本时钟源也跟随变化了,因此在调节系统时钟时,还需要把操作系统的基本时钟源也做更改。
再看串口部分,串口依然正常的收到了数据,只不过发送频率快了一些,因为外设的时钟源与系统核心不同,所以就没有出现这个问题了。
       由于板子没有引出摄像头接口,所以原计划的视频监控系统无法实现了,现在就来做一个无线传感器网络环境监测系统吧,从zigbee模块接收数据,在屏幕上显示,并存放在SD卡中,这应该也是一个不错的系统吧。

分享到:
回复

使用道具 举报

回答|共 10 个

倒序浏览

沙发

jwdxu2009

发表于 2015-12-30 22:45:43 | 只看该作者

写的好,学习和参考了
板凳

trochili

发表于 2015-12-31 11:21:55 | 只看该作者

晨枫, 打开tcl.config.h,看看最后这几个配置,修改一下mcu主频的配置。
#define TCL_CPU_LEAST_STACK            (256U)
#define TCL_CPU_IRQ_NUM                (68)
#define TCL_CPU_CLOCK_FREQ             (72U*1024U*1024U)
eeboard大力支持的开源RTOS -- Trochili RTOS
地板

晨枫-366963

发表于 2016-1-1 14:50:44 | 只看该作者

trochili 发表于 2015-12-31 11:21
晨枫, 打开tcl.config.h,看看最后这几个配置,修改一下mcu主频的配置。
#define TCL_CPU_LEAST_STACK     ...

恩,已经找到了,多谢!只要仔细寻找,一定能找到核心的地方!为飞鸟点赞!
5#

党国特派员

发表于 2016-1-2 20:00:27 | 只看该作者

不喜欢TCL,平白无故多打几个字母。。。。
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
6#

trochili

发表于 2016-1-4 14:05:46 | 只看该作者

党国特派员 发表于 2016-1-2 20:00
不喜欢TCL,平白无故多打几个字母。。。。

避免和其他代码混淆冲突,c语言没有命名空间的概念,容易出错。比如你用的fatfs,万一出来个CPU_CLK之类的宏呢,即使不冲突,也能分清楚这代码是那里定义的。程序员看到TCL_CPU_XX这样的宏,会立刻知道它是trochili里的而不是fatfs里的。
eeboard大力支持的开源RTOS -- Trochili RTOS
7#

糖悦之果飞

发表于 2016-1-4 15:25:17 | 只看该作者

分享的不错,可以将文章一并发到经验频道,获取双重奖励哟http://jingyan.eeboard.com/
8#

shadow丶

发表于 2016-1-5 16:21:46 | 只看该作者

确实很好 我也想学习下rtos 了  之前就看过一点ucos
0.0
9#

XYTA092

发表于 2016-1-9 08:39:42 | 只看该作者

学习了,谢谢分享。
10#

火oooo

发表于 2016-1-12 12:01:38 | 只看该作者

看到2345的身影了……
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条