根据I.MX6Q处理器的BSP设计经验和SAMA5D3x的BSP设计经验,编写一个BSP的的实践教程或BSP编写笔记。
BSP从系统启动开始,讲解系统的启动流程,如何实现系统打印信息、中断是系统能够运行起来。之后根据
外设编写GPIO、PLL、网络接口设计。随后完善其他内容。编写大纲如下
/*------------------------------------------------------------------------------------------*/
对次级驱动如 典型的字符设备驱动LED、KEY,I2C总线挂载设备驱动、SPI总线挂载设备驱动。均在
《SylixOS应用开发实例》说明。即《SylixOS应用开发实例》以现有的大学计划内容修改而来。
《sylixos应用和驱动/bsp移植》
《sylixos的bsp编写》
《sylixos的复杂中间件:canopen、ethercat、1553B、编解码库和硬件加速、操作系统性能测试》
sylixos性能测试包括:网络通信效率和相应时间、串口通信效率和响应时间、数学计算与裸奔、
中断响应时间和中断消耗资源统计、任务切换时间、任务切换条件和切换响应时间。代码静态分析、
操作系统资源消耗统计。
sylixos操作系统学习路线,首先是学习应用程序的编写,了解了操作系统的使用和工作后尝试编写
若干驱动,比如iic的驱动、spi的驱动,掌握基本的字符设备驱动编写、简单的块设备驱动编写等。其
次进入bsp的编写工作。bsp的编写是一个比较有成就感的工作,从代码量上看远少于应用程序和驱动,
但却需要较为全面的知识尤其是对操作系统的执行和启动有比较好的理解。bsp往往没有过多可以复用的
资源,掌握其中的调试方法和框架尤为重要。
1、首先需要查看.ld和config.h文件,从中确定系统的可用内存大小和启动地址,这里设
置的内存起始地址,在一些操作系统中可以修改起始地址,后续可以考虑下如何修改此
文件,实现内存设置和起始地址设置分离;
2、系统启动最先执行代码是bsp下的startup.S,
3、阅读startup.S可以知道,执行的第一个C语言函数是bspInit。
4、阅读bspInit函数可以了解到该函数首先是设置内核堆和系统堆,随后调用halModeInit
函数,该函数注释为初始化硬件,不过实际上该函数往往为空。因此硬件的基本初始化
已经由bootloader完成,如DRAM、调试串口、系统时钟,因此在此函数之后往往是初始
化调试串口。(注意这里的调试串口实现是不以来操作系统的,因此直接使用裸机的代
码即可,实际中不初始化也可以,因为bootloader正常说明此调试串口也正常)。
5、随后需要完善bspDebugMsg函数,此函数是不基于操作系统的调试函数,用来打印信息
,可以在bspInit函数开始位置调用此函数。编译后将系统下载到开发板中执行,如果
可以输出信息,说明系统启动地址和内存设置基本没有问题。
6\ 查看其中的函数内容,将其中的mmu初始化和cache初始化代码注释掉,以免出现莫名其
妙的问题。
6、确定系统可以从设置地址启动后,就需要完成时钟tick的设置,设置函数为
bspTickInit,在此函数中需要完成两个工作,一个是选择作为系统时钟tick的定时器
初始化,另一个是中断的初始化。
7、对于定时器的初始化比较简单,如果有裸机代码,参考裸机代码很容易就可以实现,如
果没有裸机代码参考Linux的代码,代码位置为:。定时器的设置往往是设置tick时钟
周期和运行方式,随后使能即可。
8、中断的驱动设置。主要是填写与中断相关的若干函数,有bspIntInit、bspIntHandle、
bspIntVectorEnable、bspIntVectorDisable、bspIntVectorIsEnable。完成上述5个
函数,既可以完成对该处理器的中断初始化。其中后三个中断函数非常简单,很容易就
可以完成。需要重点关注的是bspIntInit、bspIntHandle。在ARMv7系列处理器中,对
称多核的处理器使用的中断均是ARM公司提供的GIC中断控制器,对此控制器使用
SylixOS提供的驱动即可,不需要对系统进行深入了解。但在ARM的单核处理器中,无论
是早期的ARM9还是后续的Cortex A系列设计的单核处理器,半导体厂商往往会设计自己
的中断控制器。这时就需要了解SylixOS的中断实现和处理器的中断控制器特点。这里
结合AM335x和SAMA5D3x处理器的中断控制器进行说明。
分别包含:手册介绍、裸机代码,中断向量表的实现,汇编代码的说明。Linux中其中断
驱动的实现。
sylixos的中断实现代码和中断完成工作。
SAMA5D3x的sylixos中断控制器实现。
中断的调试记录:在isr中添加bspDebugMsg,系统应该能够周期性输出数值,为了方便
观察这里的tick周期应该尽可能的小,比如2Hz、5Hz等,由于硬件限制这里的SAMA5D3x
设置为8Hz。
在调试过程中一个很重要的问题是无法获取当前中断的中断号,通过仔细阅读代码
和数据手册可以了解到需要读取下IVR寄存器。虽然理论上我们应该先阅读数据手册随
后在开始编写代码,但在实际中往往不现实,一是因为时间有限,需要尽快完成工作;
如果没有遇到问题,也不清楚该阅读手册的那一部分,完全仔细研究是没有意义的,因
为很难记住其中的所有细节,而问题往往是因为细节的处理产生。
但在读取IVR中,发现只能够产生一次中断,随后系统就死掉了,仔细阅读该寄存
器的说明,可以了解到,需要在中断完成后设置eoir寄存器表示中断处理工作已经完成
在handle函数下加入此代码后,系统tick可以正常工作。
9、此时系统启动会输出没有iowrite..提示信息,因为进入系统后的shell输出需要ttyS设
备,因此在完成tick后,就需要编写一个串口驱动ttySn。参考其他处理器的驱动设计
,完成串口驱动。需要注意的是,系统默认是使用中断方式工作,因此驱动需要实现中
断发送和接收。
10、串口驱动的编写和调试:
串口驱动调试是使用的bspDebugMsg,这里会发现一个有意思的情况,我们使用串口调
试串口本身,只是二者身份不同,一个是有编制一个是没有编制。
串口驱动完成后,系统就可以输出启动界面,并且可以在控制台中使用shell命令,
11、mmu使能和地址映射的处理;
这部分工作往往属于arch层,在驱动中不需要进行什么工作,在一个操作系统完成后
,此部分代码往往不需要任何修改。但为了方便我们理解和调试其他驱动,这里对其
进行简单介绍。
12、cache的使能
此部分工作往往属于arch层,在驱动中不需要进行任何修改,操作系统完成后,此部
分代码不需要任何修改。为了方便理解DMA工作和多核同步,这里对Cache的工作进行一
些介绍。
13、看门狗使用和ctrl+x。
总结:
在完成以上工作后,意味着SylixOS已经能够正常在一个新的处理器上运行了。此部分
工作量并不多,对于一个经验丰富的工程师来讲,一两天的时间既可以完成。但要完成
此部分工作需要对处理器的工作和操作系统本身有着比较好的理解。在Linux系统中,
这部分工作是有半导体厂商完成,实际工作中接触不到这种工作,但对于实时操作系统
来讲,绝大部分是有操作系统或最终用户完成对处理器的支持。而这两类人员一般是没
有仿真器等硬件调试工作,只能够根据自己的经验和对操作系统的了解完成此工作。
bsp编写第二阶段工作:
gpio和pinmux驱动实现:处理器管脚功能往往会有复用,因此对处理器管脚进行功能设
置十分重要,而gpio在此中间扮演很重要的角色,并且在其他驱动中往往会使用到gpio进
行peihe工作。因此完成基本的工作后,完善此部分工作。
修正ttyS驱动,在开始第一阶段中,通常只会编写一个串口驱动,而且是bootloader使
用的那个串口,因此不需要管脚功能设置。这样的驱动是不严格的,因此在完成gpio和
pinmux后,需要对其进行修正。
网络驱动,网络驱动是一个较为复杂的驱动,作者本人曾经对网络驱动有恐惧心理,不
仅仅是网络本身比较复杂,而且网络驱动的调试方式与其他设备也有所区别。
ramfs的设置,完成网络后,就可以使用网络进行一些调试工作了,但这种调试依赖文
件系统,在没有编写其他的快设备驱动前,首先使用ramfs是一个比较好的选择。使用方法
如下。
nandflash驱动,目前高性能的处理器还会选用emmc作为存储介质,不过nandflash仍然
占有极大的市场且更为常见,nand的文件系统更为完善,在SylixOS中使用yaffs2文件系统,
保证掉电的可靠性。
framebuffer驱动,在arm的嵌入式应用中,hmi是一个很重要的应用场景。在嵌入式学习
中,界面编程同样也是一个非常重要的内容。在介绍本驱动之前默认读者已经根据《》掌握
了framebuffer的编程和基本的图形界面编程方法。
RTC驱动。
总结:
完成以上功能后,SylixOS已经可以满足一些常见的应用了。唯一的不足是目前还没有
触摸功能。但对于实时系统的应用来讲,很多场合都是使用物理按键而非触摸方式操作。
bsp编写第三阶段:板载总线
这里主要包括i2c、spi、sdio、usb这四类总线及摄像头camera,这些总线还往往伴随
着dma的使用,当然没有dma也可以工作,因此dma可以作为可选内容。
i2c总线, 已经编写
spi总线, 已经编写
camera 需要实践
sdio总线,需要实践
usb, 待定
总结:
完成这些总线后,常见的触摸控制芯、eeprom、spiflash、Upan、SD卡/EMMC等外设就
可以使用了,这些设备的驱动往往只需要修改下使用的总线名称,既可以使用。驱动的详细
编写需要参考《》。
bsp编写第四阶段:工业总线
这里主要包括rs485、can等工业总线,pci/pcie虽然也是板载总线,但其编程常常是
在工业应用中出现,因此也列入工业总线的范畴。