这里用来记录学习路上偶尔一些感想以及大佬分享的一些知识~
文章目录
1.Why RTOS
今天偶然间在Moore8看到了armink大神的直播分享为什么你应该使用RTOS,回想一下自己在嵌入式这条路上的所得,颇有感触,主要有两点:
- Why RTOS
- The Art Of Coding
1.1.嵌入式系统软件
1.1.1.轮询系统
轮询系统是在裸机编程的时候,先初始化好相关的硬件,然后在一个大循环里顺序的做各种事情。
- 伪代码
int main(void)
{
/* 硬件初始化 */
HardWareInit();
/* 主循环 */
while(1)
{
/* 处理事情1 */
DoSomething1();
/* 处理事情2 */
DoSomething2();
/* 处理事情3 */
DoSomething3();
}
}
- 优点 ——代码结构简单,适合一些简单且没有外部事件的应用
- 缺点
- 耗费CPU:
delay()
函数大量占用CPU,导致CPU有很长时间处于空循环状态 - 实时性差**:CPU顺序处理任务,不能及时响应外部事件
- 可移植性差**:裸机程序一般适应特定芯片,更改芯片时程序需要移植
- 模块化程度低:一个模块的功能往往是特定的,移植性差
1.1.2.前后台系统
前后台系统是在轮询系统的基础上加入中断,外部事件的响应在中断里(前台)完成,事件处理回到轮询系统(后台)中完成。
- 伪代码
int main(void)
{
/* 硬件初始化 */
HardWareInit();
/* 中断初始化 */
InterruptInit();
/* 主循环 */
while(1)
{
/* 如果事件有响应,处理事情1 */
if(flag1)
DoSomething1();
/* 如果事件有响应,处理事情2 */
if(flag2)
DoSomething2();
/* 如果事件有响应,处理事情3 */
if(flag3)
DoSomething3();
}
/* 中断服务程序 */
void ISR1(void)
{
flag1 = 1;
//DoSomething1(); //如果处理时间短则在中断中完成
}
void ISR2(void)
{
flag2 = 1;
//DoSomething2(); //如果处理时间短则在中断中完成
}
void ISR3(void)
{
flag3 = 1;
//DoSomething3(); //如果处理时间短则在中断中完成
}
- 优点
- 实时性提高:可以及时响应外部事件(不一定及时处理)
- 可以通过中断优先级设置及中断嵌套完成大多数任务可以通过中断优先级设置及中断嵌套完成大多数任务
- 缺点
- 只能及时响应,不能及时处理
- 可移植性差:每个芯片的中断系统差异更加明显,所以可移植性更差
1.1.3.多线程系统
多线程系统中将程序主体分割成一个个独立的、互不干扰的、无限循环且不能返回的小程序,即线程。
- 伪代码
int main(void)
{
/* 硬件初始化 */
HardWareInit();
/* OS初始化 */
RTOSInit();
/* OS启动,开始多线程调度,不再返回 */
RTOSStart();
}
/* 多个线程来处理事情 */
void DoSomething1(void)
{
/* 无限循环,不能返回 */
while(1)
{
if(flag1)
{
/* 处理事情 */
}
}
}
void DoSomething2(void)
{
/* 无限循环,不能返回 */
while(1)
{
if(flag2)
{
/* 处理事情 */
}
}
}
void DoSomething3(void)
{
/* 无限循环,不能返回 */
while(1)
{
if(flag3)
{
/* 处理事情 */
}
}
}
/* 中断服务函数用于响应事件 */
void ISR1(void)
{
flag1 = 1;
}
void ISR2(void)
{
flag2 = 1;
}
void ISR3(void)
{
flag3 = 1;
}
- 优点
- 实时性大幅提高:既可以及时响应,也可以及时处理
- 并发性高
- 可重用性提高:不需要重复造轮子,所有的应用都是在操作系统之上完成的,只需要操作系统适配芯片即可可重用性提高:不需要重复造轮子,所有的应用都是在操作系统之上完成的,只需要操作系统适配芯片即可
- 编程难度降低:不需要像前后台系统一样精心设计程序编程难度降低:不需要像前后台系统一样精心设计程序
- 缺点
- 操作系统自身会带来额外的FLASH和RAM开销
1.2.RTOS的意义
1.2.1.RTOS对于团队的意义
- 团队效率更高
- 模块功能分工明确
- 模块之间依赖性低
1.2.2.RTOS对于个人的意义
- 更高级的软件知识
- 使用操作系统完成更高级的应用
1.3.主流RTOS对比
μC/OS | FreeRTOS | RT-Thread | |
---|---|---|---|
性能 | |||
代码可读性 | 高 | 低 | 高(类Unix风格) |
组件丰富性 | 超过50种可重用组件 | ||
开发资料 | 全面 | 全面 | 书籍较少 |
版权 | 商业收费 | 开源免费 | 开源免费 |
社区活跃度 |
2.The Art Of Coding
在嵌入式软件这块,联系大神的分享和我自己的历程,我觉得有两点很重要:
- 代码可重用性
- 代码风格
3.Machine Learning
对于机器学习这块,其实我是不太想玩的,一方面是因为数学能力不太好,另一方面是因为以搞硬件的,凡事都想探究清楚原理,对于调用几个api玩玩应用的事情没有一点兴趣,然而事与愿违,学校刚刚学完python的课,参加FPGA邀请赛就需要在Pynq平台上实现一个神经网络CNN加速,IT界说得好,站在风口上,猪都会飞,在人工智能的浪潮下,不飞都不行,在Moore8开始了愉快的玩耍之旅,大致安排如下:
在曾新老师的TensorFlow课程引言(Introduction)课上,大神不愧是大神,能在很短的时间向别人普及一个知识,收获颇丰~
- 人工智能是大数据吗?人工智能是机器学习吗?
- 聊天机器人有感情吗?
- 能否通过历史的彩票数据预测接下来的开奖号码?
1956年香农和其它几位年轻的科学家首次提出人工智能的概念,这个时候人们的目标是让机器可以像人类一样去思考,也就是人工智能1.0时代,即鸟飞派,这个时候人工智能 ≠ 大数据 ≠ 机器学习,只是让机器去模仿人的行为和思想,后来到了1966年,诞生了人工智能2.0时代,人工智能变成了数据派,采用了基于数据和统计的方法,后来在1970-1990年代之间,两派之间各有争执,数据派逐渐超越了鸟飞派,直到2005年google基于统计+数据的翻译系统诞生后,这个争论画上了句号,此后的人工智能领域都是以数据说话的数据派,这个时候人工智能 = 大数据 = 机器学习。
数据派的研究方法如下:
- 获取数据
- 建立模型
- 修改参数
- 验证模型
这其中,建立模型和修改参数是最重要的,在对很多应用场景建模的时候,需要建立不用的模型去适应,常见的模型有以下三种:
DNN | RNN | CNN |
---|---|---|
深度神经网络 | 循环神经网络 | 卷积神经网络 |
语音处理 | 图像处理 |
这个时候再来回答前面的三个问题,相信心中都已有答案~最后借用老师在课上引用的一句话:
The mystery of machine learning is not in the code but is in the data
机器学习的神奇之处不在代码中,而在数据里。
数学之美(第二版) PDF
machine-learning - coursera
4.Linux
对于任何一个研发人员来说,Linux是最强大的操作系统,没有之一!为什么这么说呢,原因有下:
- 高效: 简单粗暴有效的命令可以高效的完成很多的日常开发工作
- 稳定:Linux运行的稳定性能用来作后台服务器再好不过了
- 安全:Linux开源,由很多的开发者共同维护,所以可利用漏洞少之又少
- 开放:Linux源码开放
- 多用户:真正的可以多用户同时工作
那么这么强大的一个系统因何而来呢?
1969年AT&T(美国贝尔实验室)有两个人——Ken,Dennis为了适配他们的游戏而研发出了Unix操作系统,并且抛弃了汇编,顺便发明了C语言,用C完成了整个操作系统,而Unix就是这个话题中的万恶之源~
其实Unix是开源免费的,因为它只是单机版,没有太大的作用,一段时间后在UC Berkeley诞生出了伟大的TCP/IP协议,使得所有的计算机都可以很好地连通,Unix演变成了BSD,以至于后来的FreeBSD,NetBSD,MacOS,iOS等等……
然而别忘了,这一切的起源是Unix,当然不可能看着BSD就这么火,Unix开始收费了,对于公司而言,收费就收费呗,无非成本价有点高,然而别忘了还有我们这群苦逼的学生,又想学习使用Unix,又买不起Unix,所以美国一个计算机科学教授Andrew Tnanebaum根据Unix写出了Minix操作系统用来教学,青出于蓝而胜于蓝,1991年美国大二学生Linus Torvalds觉得Minix不太行,所以自己写了一个Linux内核,然而它再强大,也只是一个内核~
凑巧的是,在那个年代GNU(GNU is Not Uinx)也是一个致力于自由的类unix操作系统,它发展了几乎内核以外的所有软件,并且创建了通用软件许可证GPL(General Public License) —— 免费得到源码永久使用权、可以任意修改、但是有义务公开修改后的代码~
于是乎,Linux和GNU一拍即合,天造地设的一对就这样诞生了,强强联手,演变成现在最强大的操作系统 —— GNU/Linux。
当然,Linux内核和GNU合起来也还不够,对于用户的使用,还应包含命令行Shell或桌面环境(KDE、GNOME、Unity等),所以就衍生出来很多的Linux发行版,主要有三大分支:
- redhat
- debian
- openSUSE
这些发行版如果按应用场景来分,主要有两类:
- 以命令行Shell为主的服务器发行版:CentOS/RHEL、openSUSE、Ubuntu Server
- 以桌面环境为主的桌面发行版:Ubuntu、Linux Mint、Fedora
如此强大有效的一个操作系统,仅作学习之用的话选择其中一个自己喜欢的发行版就好,我的学习旅程是:
首先在虚拟机上学习:
- 会操作:基本Linux命令,Linux文件系统
- 会编程:shell脚本编程,基本C编程,网络编程,GUI编程
然后在开发板上学习,选用ARM9或ARM11:
- 会启动:移植并成功启动
- 会驱动:可以编写常见驱动程序