有问题发issues,欢迎PR
一套低性能嵌入式开发库,基于C语言开发,封装了常用的传感器。 原本的用途是参加全国大学生智能汽车竞赛,但是在开发过程中逐步发现可以应用于一些奇奇怪怪的地方, 所以进行了相关的硬件分离便于使用。
一个和智能车没啥关系的东西
为什么会有呢?
或许是最开始的梦想吧
一个从入坑时候就开始的梦想
时光飞逝
少年终于实现了梦想
只不过
时光飞逝
话说回来
真的和智能车没啥关系吗?
或许吧
在嵌入式系统中,板级支持包(英语:board support package,简称BSP)用作初始化与执行操作系统并用于评估板(Evaluation Board)的简易程式码。 它通常包含了以基础支持代码来加载操作系统的引导程序(英语:bootloader),以及主板上所有设备的驱动程序。
在SCNS中,BSP提供了各个操作具体应该如何执行。
BSP存在的核心意义是使得移植的范围可控,并减少移植工作量。在移植的过程中SCNS库的本体不需要进行修改,只有BSP中的东西需要修改。
这个东西本质上是一个.h文件,因为后缀只看最后一个.后面的东西。
这个东西存在的意义是实现BSP的封闭,有一些类似于面向对象中的私有。
可以注意到在下面的结构图中,ScnsInclude作为include了所有模块的文件,只include了.h,而没有include .c.h。 这意味着,.c.h里面的东西不会随着include被include到别的地方,从而实现了对内的封闭。
项目主要位于scns文件夹下
其子文件夹bsp提供了板级支持包以供其余配置
模块主要分为两大类:需要BSP支持的模块与不需要BSP支持的模块。
需要BSP支持的模块由ScnsXxx.c、ScnsXxx.h、ScnsXxx.c.h以及在bsp中的ScnsBspXxx.c、ScnsBspXxx.c.h、ScnsBspXxx.h共6个文件组成。
不需要BSP的模块则只有ScnsXxx.c、ScnsXxx.h供2个文件。
设计这么多文件的主要目的是为了尽可能的封闭BSP中的内容。
各个文档之间的依赖于包含关系如下图所示。
这确实是个图,不过需要你的markdown解析器支持plantuml
@startuml
folder scns{
file ScnsInclude.h{
}
file ScnsConfig.h{
}
file ScnsXxx.c{
}
file ScnsXxx.h{
}
file ScnsXxx.c.h{
}
}
folder xxx/bsp{
file ScnsBspConfig.h{
}
file ScnsBspXxx.c{
}
file ScnsBspXxx.c.h{
}
file ScnsBspXxx.h{
}
}
ScnsInclude.h ---> ScnsXxx.h
ScnsInclude.h ---> ScnsConfig.h
ScnsConfig.h ---> ScnsBspConfig.h
ScnsXxx.h --> ScnsConfig.h
ScnsBspXxx.h --> ScnsConfig.h
ScnsXxx.h -> ScnsBspXxx.h
ScnsXxx.c.h --> ScnsXxx.h
ScnsXxx.c.h --> ScnsBspXxx.h #white;line.dotted;
ScnsXxx.c.h -> ScnsBspXxx.c.h
ScnsBspXxx.c.h --> ScnsXxx.h
ScnsBspXxx.c.h --> ScnsBspXxx.h #white;line.dotted;
' ScnsBspXxx.c.h -> ScnsXxx.c.h
ScnsXxx.c --> ScnsXxx.c.h
ScnsXxx.c --> ScnsBspXxx.c.h #white;line.dotted;
ScnsBspXxx.c --> ScnsXxx.c.h
ScnsBspXxx.c --> ScnsBspXxx.c.h #white;line.dotted;
note left of ScnsXxx.c : 实现部分
note left of ScnsXxx.h : 对外作用的声明或者定义
note left of ScnsXxx.c.h : 声明要求在ScnsBspXxx.c中实现的内容
note left of ScnsBspXxx.c : BSP实现部分
note left of ScnsBspXxx.h : BSP中对外作用的声明或者定义
note left of ScnsBspXxx.c.h : BSP中不对外作用的声明或者定义
@enduml
先把仓库搞下来。
推荐通过git submodule引入,这也是为什么这个仓库的根目录就是一堆代码,主要就是为了方便git submodule引入。
然后再搞一个BSP,可以从SCNSDemos里复制一份过来。
在BSP里,你会看到一个叫ScnsBspConfig.h,大概这样的文件
#ifndef __SCNS_BSP_CONFIG_MM32F3277_seekfree_H__
#define __SCNS_BSP_CONFIG_MM32F3277_seekfree_H__
#define SCNS_AP3216C_ENABLE 0
#define SCNS_APDS9960_ENABLE 1
#define SCNS_AT24C02_ENABLE 0
略去很多行
#define SCNS_SMCTP_EXT_OSCILLOSCOPE_ENABLE 1
#define SCNS_XPT2046_ENABLE 0
#define SCNS_YING_ENABLE 1
#ifdef SCNS_CONFIG_SET
#error multy config
#endif
#define SCNS_CONFIG_SET
#endif
这个文件是总的开关文件,可以通过SCNS_XXXX_ENABLE灵活的控制模块是否开启。你可以先把这些都关掉然后一个一个慢慢开。
一般来讲,每一个模块的移植应当参考ScnsXXXX.c.h,具体来讲:
#ifndef __SCNS_YING_C_H__
#define __SCNS_YING_C_H__
#include "ScnsYing.h"
#if defined(SCNS_YING_ENABLE)&&SCNS_YING_ENABLE==1
#include "ScnsBspYing.c.h"
这一片有一堆函数的声明,需要在ScnsBspXXXX.c中实现
/*******************************BSP.C.H*******************************
这一片有一堆,需要在ScnsBspXXXX.c.h中定义
*/
/*******************************BSP.H*******************************
这一片有一堆,需要在ScnsBspXXXX.h中定义
*/
#endif
#endif
从我也不知道哪个版本开始,SCNS支持了Init和PostInit两个初始化阶段。
顾明思意,PostInit在Init的后面。
我们不妨使用泳道图直观的看一下
@startuml
|用户应用|
start
|ScnsXXXX|
:ScnsXXXXInit();
|ScnsBspXXX|
:ScnsBspXXXXInit();
|ScnsXXXX|
:模块内部初始化;
|ScnsBspXXX|
:ScnsBspXXXXPostInit();
|ScnsXXXX|
:标记初始化完成;
|用户应用|
stop
@enduml
上面这个图实际上省略了初始化失败时的返回过程。
实际上在任一阶段,一旦初始化失败,会直接返回。
将这两段拆开的主要目的是注意到有的时候BSP也可能希望知道模块的初始化有没有完成。
需要注意的是,在部分应用中,postInit会被调用多次,例如ScnsSd中的postInit会在插卡并握手完毕,如果你在运行中反复插卡,PostInit会被调用多次,但是Init只会调用一次。
推荐移植顺序 ScnsYing->ScnsMem->ScnsTimer->其他
具体顺序应当参阅每一个模块自己的markdown,您可以在功能列表一节找到所有模块的markdown文件。
ScnsApds9960 手势传感器 开发中模块,API和依赖可能有较大变动,请谨慎使用。
ScnsBh1750 BH1750光照传感器 (有虚拟机制)
ScnsEkfCtrv Extended Kalman Filter Implementation for Constant Turn Rate and Velocity Vehicle Model
ScnsGt911 电阻触摸屏 计划重构。
ScnsGyro 陀螺仪 (有虚拟机制)
ScnsJoystick 摇杆 开发中模块,API和依赖可能有较大变动,请谨慎使用。
ScnsTouchScreen 触摸屏 计划重构。
ScnsVl53l0x 激光测距 (有虚拟机制)
ScnsVl53l1x 激光测距 (有虚拟机制)
ScnsZfDm1ra 逐飞有来模块(接收)(无MCU版本) (有虚拟机制)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。