shell: 入门
c 语言:对语言的一个认识
数据结构:对数据的一个组织
库函数和系统调用:对文件的管理,开关读写
内核:内核调度的是进程和线程(进程间通讯,进线程间同步互斥,解决资源消耗的问题),连接硬件和应用
硬件:认识硬件,认识寄存器,驱动的目的,驱动硬件,让硬件工作,同时可控。
见相应思维导图
创建设备节点:
文件操作对应虚拟文件系统,
为什么用虚拟地址
驱动链表,设备链表,匹配
项目分三部分:数据采集\数据处理\数据显示
数据采集:三个ZigBee (无线个域网)
环境信息采集需要mcu
数据处理用A9
数据显示用:web 网页
技术实现、技术表达、技术总结提升。
三个方向:
数据采集:zigbee1 + stm322
应用层
网络部分:把网络协议栈、tcp/ip、网络模型搞清楚
驱动:把硬件采集,尽可能把整个A9平台上的各种驱动跑起来,用各种字符设备框架、i2c、spi、input、misk 没教过的自学
视频仅供参考
环境搭建
教学用芯片:
ARM,Cortex-A系列,exynos-4412 处理器
多环境交叉编译方式:
举例:
vi ~/kernel/linux-3.14/Makefile +201
在CROSS_COMPILE ?=后 ,arm-linux- 前指定’/home/linux/toolchain/gcc-4.5.1/bin’ 这个绝对路 径
需求文档是变更的依据
lCD 显示屏,基于字符设备写的驱动
USB-OTG 板子可以跑安卓,通过这个接口可以下载安卓镜像和源码
Camera 摄像头接口
JTAG 板子进行仿真调试用
HDMI 高清显示接口
ZigBee 无线通讯的技术,之间可以进行组网,一个做主,另一个做从
协调器 路由 和终端节点
星型组网方式
分层意识:
如何实现数据的上行和下行:
上行:A9 数据采集线程
数据采集线程将信息填充到共享的结构体中,通过结构体将信息交给数据刷新线程
发送数据:数据刷新线程,需要共享内存和消息队列实现数据刷新线程和cgi进程,之间的通信。
数据库线程:可以自己加
下行线:
html
cgi完成c语言和HTML 语言之间的交互。
c 和 A9通信,通过消息队列
不同的下行信息交给不同的线程
消息队列有固定的结构体
参考消息队列的结构体,定义自己的结构体。 第一个参数必须是lang 类型
boa简介:
其可执行代码只有大约60KB左右,Boa是一个单任务的HTTP服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。Boa支持CGI。
Boa的设计目标是速度和安全。(CGI只是一个进程,用来提供接口),自动目录生成和自动文件枪支进行拼接。
Boa的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。
CGIC移植部分笔记: ====cgi是一个接口
CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。
CGIC能够提供以下功能:
1 分析数据,并自动校正一些有缺陷的浏览器发来的数据;
2 透明接收用GET或 POST方法发来的Form数据;
3 能接受上传文件;
4 能够设置和接收cookies;
5 用一致的方式处理From元素里的回车;
6 提供字符串,整数,浮点数,单选或多选功能来接收数据;
7 提供数字字段的边界检查;
8 能够将CGI环境变量转化成C中的非空字符串;
9 提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;
总之,CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作系统。
gcc -static 命令
编译内核
第一,知道内核的路径在哪里
第二,知道模块的路径在哪里
-C 指定makefile 的路径
M= 指定当前模块路径
驱动层只负责让硬件正常工作,并向外提供接口,应用层负责对硬件控制的逻辑
TlistToggle
1 真实物理地址映射虚拟地址
2 readl
3 writel
问题:移植完cgi 文件后一定要赋执行权限
抽象别人写代码的过程
分层意识,数据流
不需要刻意关注平台,要关注数据量
不需要刻意关注语言上的差异,定义好接口就行
4、学习网站: html css
http://www.runoob.com/html/html-tutorial.html
今天,我在写CGI程序,把后台数据返回到前台页面上,出现乱码,
不好看,所以,我在Content-type:application后面加了字符集的设置(字符集和前端一样),
fprintf(stdout, “Content-type:application/json;charset=‘GBK’\n\n”);
应该就解决问题了,但是还是不行,我就写成下面这样子
fprintf(stdout, “Content-type:application/json;charset=GBK\n\n”);
好了,如右图: 嘻嘻~
另外,说明一下,我的前端网页是GBK编码。 只有前端和后台编码一致,自然不会出现乱码。
MJPG简介
MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名.
MJPEG全名为 “Motion Joint Photographic Experts Group”,是一种视频编码格式,
Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘上。典型的应用如数字视频记录器等。MJPEG不像MPEG,不使用帧间编码,因此用一个非线性编辑器就很容易编辑。
MJPEG的压缩算法与MPEG一脉相承,功能很强大,能发送高质图片,生成完全动画视频等。
MJPG-streamer从Linux-UVC兼容的网络摄像头,文件系统或其他输入插件中获取JPG,并通过HTTP将它们作为M-JPEG流式传输到网络浏览器,VLC和其他软件。它是uvc-streamer的继任者,uvc-streamer是一个Linux-UVC流媒体应用程序。
移植完成后,在PC机打开一个网页,输入http://192.168.1.100:8080/?action=stream就可以看到图像。 (板子ip)
ZigBee 标准是基于IEEE802.15.4标准的个域⽹、低数据速率、短距离⽆线通信定义的⼀系列通信协议。基于 ZigBee 的⽆线设备⼯作在2.4GHz(全球流⾏)、915MHz(美国流⾏)和868MHz(欧洲流⾏)3个频段上,分别具有最⾼250kbit/s、40kbit/s和20kbit/s的传输速率。
1、获取环境温度,发生至网关(协调器),由网关将环境数据通过串口方式发送至M0线程。
2、M1线程通过串口通讯,下发命令到zigbee网关,最终控制终端风扇工作。
协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个缺口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。
ZigBee协议栈的实时性要求不高,OSAL采用了轮询任务调度队列的方法来进行任务调度管理。
PxSEL //决定IO⼝功能, 1表示⽚上外设,0表示普通IO⼝ PxDIR //决定输⼊还是输出, 1表示输出, 0表示输⼊
PxINP //决定是上下拉模式还是三态
注意:P2INP这个特殊寄存器,它的低四位是控制P2⼝上拉模式还是下拉模式,⽽⾼三位7,6,5是对应控制P2-P0的GPIO端⼝具体是上拉还是下拉
有关系的两个线程不要用同样的锁锁定共享变量,不然容易产生死锁.存疑
线程间同步互斥的操作:
1、线程间同步 ==== 有序执行
1、多个信号量
2、条件变量+互斥锁 ===>broadcast signal
2、线程间互斥 ==== “你死我活”
1、单个信号量
2、互斥锁
同步和互斥是为了什么?
为了保护临界资源
什么是临界资源:
全局变量
pthread_create之前的成为 全局资源 =====>当有线程操作全局资源的时候 ===>变为临界资源
GPRS技术(General Packet Radio Service)是GSM移动电话用户可以使用的一种移动数据业务。GPRS是GSM的延续,与以往在顿道上采用电路交换的传输方式不同,GPRS是以数据包(Packet)的方式来传输的,使用者所负担的费用是以其传输的数据流量计算的,并非使用其整个频道,因此理论上较为便宜。GPRS的传输速率可提升至56kb/s甚至114kb/s。 [1]
GPRS的最大优势在于:它的数据传输速度不是WAP所能比拟的。目前的GSM移动通信网的传输速度为每秒9.6KB,GPRS手机在推出时已达到56kb/s的传输速度,到现在更是达到了114kb/s(此速度是常用56K Modem理想速率的两倍)。除了速度上的优势,GPRS还有“水远在线的特点”,即用户随时与网络保持联系。举个例子,用户访问互联网时,单击一个超级链接,手机就在无线信道上发送和接收数据,主页下载到本地后,没有数据传送,手机就进入一种“准休眠”状态,手机释放所用的无线频道给其他用户使用,这时网络与用户之间还保持一种逻辑上的连接,当用户再次单击,手机立即向网络请求无线频道用来传送数据,而不像普通拨号上网那样断线后还得重新拨号才能上网冲浪。
GPRS模块,是具有GPRS数据传输功能的GSM模块。GPRS模块就是一个精简版的手机,集成GSM通信的主要功能于一块电路板上,具有发送短消息、通话、数据传输等功能。GPRS模块相当于手机的核心部分,如果增加键盘和屏幕就是一个完整的手机。普通电脑或者单片机可以通过RS232串口与GPRS模块相连,通过AT指令控制GPRS模块实现各种基于GSM的通信功能。
GPRS模块区别于传统的纯短信模块,两者都是GSM模块,但是短信模块只能收发短信和语音通讯,而GPRS模块还具有GPRS数据传输功能。”
ZigBee® 是一种基于标准的无线网状网络,广泛用于楼宇自动化、照明、智能城市、医疗和资产跟踪。 ↩︎
STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核 。按内核架构分为不同产品:主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7) ↩︎