本帖最后由 Simon21ic 于 2015-12-13 13:31 编辑
最近又在找兼职人员了,就把以前的简介更新一下,希望兼职人员看这个帖子就能够自行学习这套构架。
需要的一些基础:
1. C语言能力
这个不仅仅是C语言的基本语法,我们的系统,基本上都是使用OOC(面向对象的C语言)实现的,所以,也需要了解OOC,甚至面向对象的一些东西。
如果经常看linux代码的,那这些估计不会是问题,可以直接上手看我们的代码
2. 操作系统
当然,这里的操作系统,是指嵌入式使用的操作系统。
需要的不仅仅是在各个操作系统上开发应用的能力,最好是能够看过一些操作系统的核心代码。知道操作系统的多任务开发方式,知道信号量等基本的IPC
3. 基本的嵌入式开发能力
这个不用多说了,包括调试能力,看懂原理图,看懂英文文档等等
其他有兴趣的兼职人员,也可以联系我,兼职费用一个月3000RMB。
当然,兼职前,我也需要确认能力适合我们的兼职任务。
VSF构架虽然是我几年前做的东西,不过近一年来,对系统部分的改动比较大。
以前VSF可以认为就是状态机轮询的构架,没有系统部分。最新的VSF构架使用了事件驱动构架,并且在事件驱动的基础上,实现了PT现成,longjmp线程。这套系统构架只是我自己经过将近10年的各种项目的代码,提炼出来的一套东西而已。也只是2年前才开始的,不确保适用各种环境,不确保没有BUG。
VSF设计的目的,一开始是为了简化开发,之后又加入了多任务的内核,以及各种协议栈的支持。
VSF不是为了替代RTOS,只是为了提供一个微内核的系统,在特定的应用环境下,可以得到比较好的性价比,也可以提高一些开发效率。
当然,我相信大部分MCU开发人员都没有接触过类似的构架,这套系统的学习成本不低,也顺便作为我们这里兼职的一个门槛吧。
目前我最有兴趣的一个系统构架就是VSF了,这个我会一直维护下去,希望以后能够交流各种系统构架的人越来越多。
这里就简单分几点说明VSF的一些特点
1. 芯片的hal(硬件抽象层)接口
各种不同的处理器,都有一些通用的外设,比如GPIO,SPI,IIC,USB,Timer等等。虽然各个芯片上的IP核一般都不一样,但是接口的功能几乎都是一样的。
VSF构架首先解决的是代码通用性的问题,也就是说,开发的高层代码,并不依赖特定的处理器。这个对于开发、移植、代码重用来说,提供了非常大的方便。当然,由于引入了通用hal层,效率上肯定会低一些。
相信很多人用过stm32的库,可以简单的认为,VSF里的hal层,就是实现自己的库(或者调用官方的库,做一个API接口的转换)。而且,不光stm32使用这个库的接口,其他各个处理器都使用同一个接口定义。
这里举个最简单的GPIO的例子就可以说明了:
对于PB.3(不同处理器的命名可能不同),这里抽象为GPIO port1的第3脚(序号从0开始)gpio_init(1);//初始化Port1
gpio_coinfig_pin(1, 3, GPIO_OUTPP);//配置 Port1的第3脚为推挽输出
gpio_set(1, 1 << 3);//置高Port1第3脚
这个代码,在不同的处理器上(只要我们移植了响应的驱动),就都可以使用,并且行为一致。
在发一个我们wifi模块的SPI底层访问的驱动接口:
static void bcm_bus_spi_select(struct bcm_bus_t *bus)
{
if (bus->port.spi.cs_port != IFS_DUMMY_PORT)
{
interfaces->gpio.clear(bus->port.spi.cs_port, 1 << bus->port.spi.cs_pin);
}
else
{
interfaces->spi.select(bus->port.index, bus->port.spi.cs_pin);
}
}
static void bcm_bus_spi_deselect(struct bcm_bus_t *bus)
{
if (bus->port.spi.cs_port != IFS_DUMMY_PORT)
{
interfaces->gpio.set(bus->port.spi.cs_port, 1 << bus->port.spi.cs_pin);
}
else
{
interfaces->spi.select(bus->port.index, bus->port.spi.cs_pin);
}
}
这里,SPI接口上,有一些芯片是支持CS引脚,有一些芯片是需要使用一个GPIO来控制CS的。
所以,bcm_bus_spi_select就根据硬件接口的设置,自动判断是使用SPI的CS引脚还是使用一个GPIO。
另外,这里的interfaces->gpio以及interfacaes->spi是老的接口定义,新的接口可以不使用指针,直接使用gpio_XXXX和spi_XXXX接口。
bcm_bus_spi_transact里,是一个PT的函数,具体之后在系统构架里说明了。
这个代码放在不同芯片上使用的话,只需要底层提供gpio和spi驱动就可以了,不用做任务修改。
当然,由于硬件可能不同,控制同一个功能的资源可能不同(比如,有些硬件,wifi芯片的片选使用一个固定的GPIO,有些使用SPI的某个CS脚)。那么,每个工程,都需要有一个硬件配置文件。
这个硬件配置文件和应用相关,也和使用的硬件相关。比如,一个应用使用了wifi,那么硬件配置文件里,就需要有wifi芯片的对应接口的定义,比如SPI使用2号,片选使用GPIO0.1,中断使用8号等等和硬件相关的信息。
2. 面向对象的C语言
类似各种RTOS等操作系统,VSF构架中,各个部分的代码也都是面向对象的。
以前发过一个面向对象的队列的代码,可以参考一下:
https://bbs.21ic.com/icview-1127252-1-1.html
面向对象和语言的关系不是最大,C语言也照样可以实现面向对象,linux内核就是一个非常好的例子。
以前傻孩子和我说过,面向对象不看语言,而是看人,这个是很有道理的。
有些人用C++也只是用面向过程的方式,有些人用C也一样可以做面向对象。
3. 协作式多任务内核,IPC,特定条件下的抢占功能
上面说的2个特点,基本只是一些基础性的东西,而这里开始,会涉及到系统构架。
VSF的这套操作系统的构架,其实也只是去年开始设计的,经过几个项目的验证,也算是比较完善了。
不过,这个对开发人员的要求相对较高,而且也是一套专用系统,只有我们自己使用。所以,我也一般不推荐我们的全职和兼职人员以外的人去学习。
毕竟,学一套新的系统需要话很多时间的,同样话时间学我们的专用系统,不如去学一些通用的RTOS来的有用。
这里引用一些以前的帖子,应该说明了比较详细了:
事件驱动构架:
https://bbs.21ic.com/icview-1054936-1-1.html
线程的示例:
https://bbs.21ic.com/icview-1075366-1-1.html
PendSV实现的抢占式事件队列:
https://bbs.21ic.com/icview-1190304-1-1.html
事件驱动构架中的信号量等IPC:
https://bbs.21ic.com/icview-1070216-1-1.html
PT线程(共享堆栈):
https://bbs.21ic.com/icview-810714-1-1.html
setjmp/longjmp线程(独立堆栈):
https://bbs.21ic.com/icview-1200092-1-1.html
流驱动模型的思想,这里的流模型不依赖我们的系统构架:
https://bbs.21ic.com/icview-1091862-1-1.html
这里,我就只是简单介绍一些这个系统运行的方式:
main函数在系统初始化完成后(包括硬件初始化,各个事件队列(main事件队列,PendSV抢占式事件队列,其他特殊中断的事件队列)的初始化,任务初始化),就进入消息轮询阶段。
main函数轮询的是main事件队列,这个是优先级最低的事件队列。
轮询事件队列其实也非常简单,就是看事件队列中是否有事件,有事件的话,那就发给对应的任务去处理事件,如果没事件的话,那就休眠。
PendSV里的事件队列用于处理中断的后续操作,处理完事件队列中的所有事件后,PendSV返回,退出中断
每个任务也可以给自己或者其他任务发送事件。当然,根据调用环境,可以发送到事件队列,也可以直接调用其他任务的处理函数,处理事件。
那么每个任务,在事件处理上,就可以简单的认为只是一个event handler接口,可以处理各种不同的事件而已。
当然,这里的问题是,如果整个系统都是使用类似event handler的方式实现的话,开发会变得异常麻烦。
这里就引入的PT线程以及longjmp线程,可以自行看相应的帖子。通过这些线程的实现方式,一个任务就可以像其他RTOS里的任务一样编写了。
4. 通用协议栈,辅助工具
这里就是利用VSF的系统构架,和提供的功能,实现的一些协议栈。
比如,USB主从机协议栈,tcpip协议栈,蓝牙协议栈(还未公开)等。
系统还提供了很多辅助的类,比如fifo类,stream流驱动类,队列类等等。
还有一些辅助的工具,比如bufmgr内存管理,这个和C语言的malloc比起来的话,可以支持对其的内存分配(比如OHCI对一些数据结构的分配,要求512字节对其),也支持内存guard,可以检测内存越界。
还有一些接口标准,比如流驱动接口标准,块驱动标准等,这些会增加一些通用性。(比如,音频播放时候,不管关心音频流是从文件流过来的,还是从tcp流过来的)
当然,这些也都是面向对象的C语言实现的,可以方便应用的开发。用到的时候,可以自行去看相应的代码。
5. 看你想不想得到的奇葩应用
动态加载:
https://bbs.21ic.com/icview-1037862-1-1.html
一些应用相关的帖子:流驱动:
https://bbs.21ic.com/icview-1091862-1-1.html
信号量:
https://bbs.21ic.com/icview-1070216-1-1.html
|