文章目录
- 一、学习Linux环境安装
- 二、 如何学习嵌入式、Linux驱动?
- 三、物联网专业
- 五、单片机转Linux?
- 五、运维
- 六、汇编级的性能优化
- 七、嵌入式前景
- 九、内核api太多,如何看内核文件?
- 八、 C语言学习困难怎么办?
- 八、大一大二寒暑假干嘛?
- 九、为什么大学教的c语言都是皮毛?
- 十、什么是外包、外协?
- 十一、ODM、OEM
- 十二、阻塞、非阻塞
- 十二、证书
- 十三、如何做内核编程?poll如何编写?
- 十四、如何移植一个RTC驱动
- 十五 嵌入式测试
- 十六 字符设备、块设备、网络设备
- 十七、对日外包
- FPGA
- 本科生做什么嵌入式项目比较好?
- 大专生 做什么项目?
- C++ 什么方向好 本三
- 刚毕业小白想做嵌入式
- python有没有出路
- 运维有没有出路?
- 学算法、python
- Linux玩的溜
- 看书好还是看视频好
- 英语非常重要!!!!!
- 大二软工 读研还是就业?
- 亚信
- 朋友
- whereis? reboot?
- 二本java
- qt
- 计划
- 技术直播
- 口才的提升
- SDK
- 零基础,入门多长时间
- 运维
- 考研
- 学习技术最佳时间
- IT喜欢年轻人
- 一、异常向量表为什么要修改基地址?
- 二、 应用层如何调用内核的函数?
- 三、抓包工具的使用
- 彭老师,关于您的“C代码解析网络数据包”文章:
直播间信息
名字: 一口网Linux直播间
ID :22719960
http://live.bilibili.com/22719960
电子文档
yikoupeng
一、学习Linux环境安装
1. ubuntu下载地址
http://mirrors.aliyun.com/ubuntu-releases/16.04/ubuntu-16.04.7-desktop-amd64.iso
2. vmware下载地址
https://www.vmware.com/go/getworkstation-win
二、 如何学习嵌入式、Linux驱动?
参考以下嵌入式学习路线
https://blog.csdn.net/daocaokafei/article/details/108513929
建议:先学习第一阶段,把C语言基础打扎实,然后学习linux系统编程,
最后如果想继续深入驱动,建议购买一个arm板子进行学习,尽量选择资料视频齐全的板子,不要只关注板子价格。
参考哪些书籍?
宋宝华《宋宝华基于最新的Linux4.0内核》
关注公众号: 一口Linux
后台回复 : 宋老师
我写的驱动入门的教程:
https://mp.csdn.net/console/columnManage/10323327
三、物联网专业
1. 物联网涉及的专业课程
物联网不是一个新的行业,没有任何新的技术,只是传统技术的集合,形成的一个新的概念。
-
硬件(stm32)、电子,电路设计
-
无线通信协议: 感知层
将电子模块通过这些无线协议可以联网 低功耗、速度快、带宽不高
蓝牙 BLE 、 zigbee 、NBIOT、lwm2m、lora -
网关 :把采集的数据汇总发送到服务器
嵌入式产品(arm + linux) 家用无线路由器,无线AP、小基站 -
网络支持: 3大运营商
万维网、广域网、internet**移动**-移动端 **电信**-数据业务比较好- 电话-cdma **联通**-都不好,
pc :epon 光纤入户
手机 :wlan + 3G 4G 5G
- 服务器(后台) : java + 数据库
- 前端 : web server
h5,android、ios
2. 就业方向
如果不是垄断行业,所选择的行业必须和互联网靠拢
万物互联
已经被互联网洗牌的传统行业:
物流、金融、教育(空中英语、学而思、新东方、艺术)、
幸存的行业
石油、烟草、医疗、
最牛的物联网中心: 无锡
很多高校,申请物联网专业,南邮 物联网学院。但是其实师资并没有跟得上。
四、学c 电路 选哪一个?
- 电路方向:
电路设计 芯片集成度,
技术含量 : 不高,
职位 : 需求不多
就业 : 很多公司不愿意招应届生,很多公司宁愿招一个有经验的,
收入 : 单片机 15 , 驱动 25+
颜色太炫,时间长了,眼睛受不了
越老越吃香: 有一点
- C方向
软件方向,
技术含量 : 单片机 - 前景一般, linux驱动 : arm+linux - 高一些
职位 : 多一些,底层比上层需求要少,
就业 : 很多公司不愿意招应届生,
越老越吃香: 单片机 - 2年, linux驱动: arm+linux - 高一些
收入 :
五、单片机转Linux?
可替代性
1. 单片机前景
2年,就学的差不多了,就遇到瓶颈了,领导会觉得10年经验和1-3年经验没什么差别,
keil iar
2. 怎么转
Linux + 驱动
-
基本操作
-
系统编程 文件IO 进程线程 网络 socket
-
系统移植 uboot 内核编译 驱动移植 文件系统制作
-
驱动架构 字符设备 块设备 网络设备
arm板子
先看资料全不全
走歌人 现场版 洒脱 豪放 漂泊
五、运维
centos
运维
发展,会一门语言 python shell
只要活干完了,8点多钟就可以下班了!
- 活干不完 11之后
- 8点多钟 是正常下班时间
- 就:8点钟下班 他觉得已经很幸福了
愿意去非洲 工资是零花钱 疟疾 孤独 + 寂寞
狼性文化,
为什么要离职?你应该去离婚啊!
六、汇编级的性能优化
编译器帮我们做好了
https://blog.csdn.net/daocaokafei/article/details/111054121
七、嵌入式前景
和互联网对比
优点:
不用堆代码,需求也会改(往往是硬件引起的需求更改),
越老越吃香,
可替代性
缺点:
枯燥
门槛特别高
要学的东西太多了, 2年入门 5年稍微独当一面,精通 10
收入
一开始不高,后劲还可以
九、内核api太多,如何看内核文件?
1 会看内核目录
https://www.bilibili.com/video/BV19v411h7g9/
比如:想学习i2c
i2c与驱动无关的代码,core
\linux-3.14-fs4412\drivers\i2c
2 查阅代码
source insight
八、 C语言学习困难怎么办?
- 基本语法
后台回复: 电子文档
- 做项目
入门项目
《从0写一个电话号码管理的C入门项目【适合初学者》
https://blog.csdn.net/daocaokafei/article/details/119961171
- 提升
加入一些库,
数据库: sqlite3
线程: pthread
套接字:socket
《从0实现基于Linux socket聊天室-增加数据库功能-5》
一定程度上,想到就能写出来!
- Linux内核
语法不是考虑的重点,
设计模式,
八、大一大二寒暑假干嘛?
C语言打扎实
【电子文档】
九、为什么大学教的c语言都是皮毛?
大学课程是怎么设置的?
- 时间、课时都定死了,只有实验能相对可以调整一下
- 老师,研究生+ 、博士,
学历和能不能上好课 没有直接关系,
大学老师关注什么? 钱 职称 职位 ==== 文章、申请课题 - 老师如何上课?读课件
- 老师编程水平如何?很一般, 必须通过项目来磨练。
- 学生能不能提意见?
费曼
十、什么是外包、外协?
进入华为的项目组,这种说辞的都是外包公司
外包公司:
中软国际、软通、中科创达、东软国际、文思海辉、诚迈、润和
-
人力外派
和中科创达签合同,人到华为上班 -
项目外包
和中科创达签合同,在中科上班,做的是华为的项目
优点:
收入还可以,一般高于市场价,
大的外包公司还比较稳定
学历要求低
上升的还挺快的
缺点:
面试,定岗
人力外派:缺少归属感
OD 德科
十一、ODM、OEM
OEM
贴牌
10万件 5000 尾单
ODM
做手机, 骁龙888
精一通百
十二、阻塞、非阻塞
内核等待队列参考 《手把手教Linux驱动9-等待队列waitq》
阻塞函数
scanf
gets
read()
write()
recvfrom()
select()
进入阻塞状态下,进程会进入休眠,直到有其他任务把他唤醒,还有有信号打断 ctrl+c SIGINT
十二、证书
软考 3级 考
职称 评
PM
inline volatile
extern
十三、如何做内核编程?poll如何编写?
- 如何编译内核模块
- 字符设备架构 .open .read .write .poll
- 等待队列 wait queue
https://blog.csdn.net/daocaokafei/article/details/108071589
https://blog.csdn.net/daocaokafei/article/details/108171965
https://blog.csdn.net/daocaokafei/article/details/108172338
https://blog.csdn.net/daocaokafei/article/details/108219511
https://blog.csdn.net/daocaokafei/article/details/108846894
https://blog.csdn.net/daocaokafei/article/details/108846952
十四、如何移植一个RTC驱动
-
先了解该外设驱动内核是否支持?
-
已经在内核了
编译进去
make menuconfig
重新编译内核即可
- 修改设备树
先看下内核有没有相关说明文档
但是没有,就去看下内核原始的设备树文件中,有没有
没有 ,只能去百度,搜索下
https://www.pianshen.com/article/39211943822/
十五 嵌入式测试
-
Linux 入门知识点
建议入门学习以下知识点:
https://blog.csdn.net/daocaokafei/article/details/109288694 -
脚本
shell脚本 -
硬件
会看基本电路图,信号线,中断线,电源线,数据线(tx/rx)
示波器
万用表
常见协议波形要会看! -
文档
十六 字符设备、块设备、网络设备
- 字符设备架构:
不定长,若干个数据(1-N)
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
int (*release) (struct inode *, struct file *);
};
- 块设备
磁盘是如何管理的?
按页管理,4k,
驱动如何编写?
驱动操作磁盘最小的单位就是bio。
block 512
struct gendisk {
/* major, first_minor and minors are input parameters only,
* don't use directly. Use disk_devt() and disk_max_parts().
*/
int major; /* major number of driver */
int first_minor;
int minors; /* maximum number of minors, =1 for
* disks that can't be partitioned. */
char disk_name[DISK_NAME_LEN]; /* name of major driver */
char *(*devnode)(struct gendisk *gd, umode_t *mode);
unsigned int events; /* supported events */
unsigned int async_events; /* async events, subset of all */
/* Array of pointers to partitions indexed by partno.
* Protected with matching bdev lock but stat and other
* non-critical accesses use RCU. Always access through
* helpers.
*/
struct disk_part_tbl __rcu *part_tbl;
struct hd_struct part0;
const struct block_device_operations *fops;
struct request_queue *queue;
void *private_data;
int flags;
struct device *driverfs_dev; // FIXME: remove
struct kobject *slave_dir;
struct timer_rand_state *random;
atomic_t sync_io; /* RAID */
struct disk_events *ev;
#ifdef CONFIG_BLK_DEV_INTEGRITY
struct blk_integrity *integrity;
#endif
int node_id;
};
struct block_device_operations {
int (*open) (struct block_device *, fmode_t);
void (*release) (struct gendisk *, fmode_t);
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*direct_access) (struct block_device *, sector_t,
void **, unsigned long *);
unsigned int (*check_events) (struct gendisk *disk,
unsigned int clearing);
/* ->media_changed() is DEPRECATED, use ->check_events() instead */
int (*media_changed) (struct gendisk *);
void (*unlock_native_capacity) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *);
int (*getgeo)(struct block_device *, struct hd_geometry *);
/* this callback is with swap_lock and sometimes page table lock held */
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
struct module *owner;
};
块设备,驱动主要解析bio
/*
* main unit of I/O for the block layer and lower layers (ie drivers and
* stacking drivers)
*/
struct bio {
struct bio *bi_next; /* request queue link */
struct block_device *bi_bdev;
unsigned long bi_flags; /* status, command, etc */
unsigned long bi_rw; /* bottom bits READ/WRITE,
* top bits priority
*/
struct bvec_iter bi_iter;
/* Number of segments in this BIO after
* physical address coalescing is performed.
*/
unsigned int bi_phys_segments;
/*
* To keep track of the max segment size, we account for the
* sizes of the first and last mergeable segments in this bio.
*/
unsigned int bi_seg_front_size;
unsigned int bi_seg_back_size;
atomic_t bi_remaining;
bio_end_io_t *bi_end_io;
void *bi_private;
#ifdef CONFIG_BLK_CGROUP
/*
* Optional ioc and css associated with this bio. Put on bio
* release. Read comment on top of bio_associate_current().
*/
struct io_context *bi_ioc;
struct cgroup_subsys_state *bi_css;
#endif
#if defined(CONFIG_BLK_DEV_INTEGRITY)
struct bio_integrity_payload *bi_integrity; /* data integrity */
#endif
unsigned short bi_vcnt; /* how many bio_vec's */
/*
* Everything starting with bi_max_vecs will be preserved by bio_reset()
*/
unsigned short bi_max_vecs; /* max bvl_vecs we can hold */
atomic_t bi_cnt; /* pin count */
struct bio_vec *bi_io_vec; /* the actual vec list */
struct bio_set *bi_pool;
/*
* We can inline a number of vecs at the end of the bio, to avoid
* double allocations for a small number of bio_vecs. This member
* MUST obviously be kept at the very end of the bio.
*/
struct bio_vec bi_inline_vecs[0];
};
- 网络设备
数据包,
sk_buff
struct net_device {
char name[IFNAMSIZ];
int irq; /* device IRQ number */
struct pm_qos_request pm_qos_req;
};
struct net_device_ops {
int (*ndo_open)(struct net_device *dev);
int (*ndo_stop)(struct net_device *dev);
netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb,
struct net_device *dev);
}
struct sk_buff {
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev;
}
十七、对日外包
东华理工 南昌
嵌入式专业
一门心思要出国,日本 11年-12
梁博
IBM,懂 嵌入式 + 日语
施乐!
《硅谷风云》
有基于这个特长,再加上技术的,可以有个不错的发展,
十八、学历问题
一个同学
- 专科
- 大三,专转本,读的二本
- 进入某个三本学校,实验员
- 2年后转讲师,
- 读了在职研究生
- 15年读博士,南京理工大学博士
- 2020年毕业,
- 进入大学当教授
十九、软件开发一般流程
举例:已经有产品了,还有部分功能要开发
市场人员 + 项目经理对接市场需求 《需求分析》
研发主管 《概要设计》
研发部 《详细设计》
研发部 编码
研发部 《代码走查》
研发部 《单元自测》
测试部 《集成测试》
小公司:(要求全能)
提需求
写代码
自测
FPGA
赛灵思,xilinx设计一个芯片,采样,verilog
IP核:协议栈、dma、
PCIE xdma
效率非常高
含金量很高,
就业领域
军工、通信
需求量不高
中兴华为
大厂 乙方、丙方,丁方
可能就没有精力去学ARM linux
该怎么办?
自学,
B站 : 线上大学
- 系统化看一遍,多看几遍
c语言
公众号 一口Linux 回复【电子文档】
yikoupeng
本科生做什么嵌入式项目比较好?
水平: 自己水平
linux,c语言,硬件
做一个简单的物联网项目《物联网数据采集系统》
- 上位机 + 下位机
- 采集传感器 数据,可以控制外设
- 存储到数据库中
- 板子:stm32 、
进阶
- socket
- web服务器,通过浏览器可以访问数据
大专生 做什么项目?
半年C JAVA
C
JAVA
《图书管理》 单机,
聊天室
C/S
socket
线程,多进程
学linux千万不要看《鸟哥私房菜》
当工具书来看。
用到的去搜索,
要有解决问题,
C++ 什么方向好 本三
-
QT前景
军工,
手持终端 仪器仪表 -
.net
-
ios
object-c
刚毕业小白想做嵌入式
尽量,本科,(函授、自考、夜大)
《某嵌入式培训机构教学总监总结的嵌入式学习路线》
C语言 Linux操作
Linxu系统编程:进程 线程、同步互斥,进程间通信
网络 :常见协议、组网、套接字,
ARM mips :
OS : linux 、
python有没有出路
运维有没有出路?
网络工程师 + 测试 + 售前 + 售后
有一定基础,
- 工具书《鸟哥私房菜》
- 《shell》
- 网络,《tcp/ip》,抓包工具,—>5G
- 数据库
- 建议往编程方向走----->python 写脚本
学算法、python
hadoop
Linux玩的溜
通过编写代码实现常用命令
看书好还是看视频好
有人指导你看书 有人指导你看书。
到底什么视频,
英语非常重要!!!!!
招聘 学历、 籍贯、 英语
阳光电源
安卓 + jini
pmon
大二软工 读研还是就业?
安徽师范大学 芜湖
鼓励考研----》 先保证考上----》 专业-----》 一本 211 985 ------》 城市问题
专科
- 专转本 专升本 二本 三本
亚信
朋友
大专、
专转本
GCT
三本学校:实验室老师---->讲师-------->中级职称
读了博士,去年毕业了,
whereis? reboot?
二本java
徐州工程学院 苏北小清华
提升学历,
考证、软考、职称、
徐州
qt
军工、汽车 手持终端
龙芯
前景
计划
春节后:基础阶段—linux基本操作-----C语言---- shell-------数据结构------linux系统编程—
文章 + 视频 + 直播
技术直播
-
枯燥
-
门槛高
对主播要求很高,
扎实的技术知识,知识面要广,
知识的记忆,
软件知识,会用不代表能讲明白,
口才,
程序猿特点?
-
嘴巴不会说,喜欢较真,
程序是世界上最简单的,
女孩子比较感性,思维逻辑是和男孩子是有差异的。
不会哄人。 哄人 == 骗人 != 诈骗 代表当时的情感,
直男癌,
理工科,数学、物理、化学、dsp、信号系统、电磁场电磁波、线性代数、离散数学,大学物理,
通信原理、工程数学、线性代数逻辑 充分必要
-
情商低,能捋的清代码,捋不清自己的女朋友为什么生气?也不知道如何哄女朋友。
-
不修边幅
口才的提升
培训之后才开始提升, 驱动,嵌入式 **做笔记,知识看的再多记不住,不如少看几本书,你能把他说出来**
《明朝那些事》
计算机讲的有意思?
嵌入式 Linux
-
static变量
1 #include <stdio.h>
2
3
4 int global = 10;
5
6 static int sglobal ;
7
8 void func(void)
9 {
10 static int peng = 0;
11
12 printf("peng = %d \n",peng++);
13
14 }
15
16 int main(int argc, char **argv)
17 {
18
19 func();
20
21 func();
22
23
24 return 0;
25 }
线程中的static变量
- 什么是线程?
公司 培训机构
老板
市场部—负责对接客户
技术部—上课
三个角色 就像 线程
合到一起,就像一个进程
公司和公司之间 就像进程之间
阿里巴巴 恒大
- API
NAME
pthread_create - create a new thread
SYNOPSIS
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.
void *(*start_routine) (void *)
- 线程共享进程一些资源
全局变量,打开的文件描述符,
代码段,data
- 不共用
局部变量 不共用
1 #include <stdio.h>
2 #include <pthread.h>
3
4 void *func (void *arg)
5 {
6 static int a = 10;
7
8 while(1)
9 {
10 sleep(1);
11 printf("this is thread %d\n",a++);
12 }
13 }
14 int main(int argc, char **argv)
15 {
16 pthread_t th;
17 pthread_t th1;
18
19 pthread_create(&th, NULL, func, NULL);
20 pthread_create(&th1, NULL, func, NULL);
21
22 while(1)
23 {
24 sleep(1);
25 // printf("this is main \n");
26 }
27 return 0;
28 }
SDK
软件产业链
壳子
屏幕
软件
设计 (EDA)----》 芯片--------->(方案厂商)---------> 系统集成商
台积电 芯片厂商
龙芯
sdk, pmon kenel longix/rootfs
零基础,入门多长时间
-
学历
本1 -
专业
软工程 -
java python 前端 大数据 ai vi (大厂)
海康威视 —> 安防
大华 ---->
宇视 ---->
linux vxworks fpga
运维
知识面广、脚本、python shell
考研
比较赞同,
普研 : 学硕 专硕
在职研究生, GCT 单证 、 MBA 双证
条件允许,去考
好处:
学历有一定含金量的
研究所、
找对象,
将来的圈子,
坏处:
比较水
二本学生、专业课不会,
3年时间,
学习技术最佳时间
18-25
IT喜欢年轻人
能加班、
性价比
IT
前5年, 5-15 多结交人脉
一、异常向量表为什么要修改基地址?
二、 应用层如何调用内核的函数?
-
- 系统调用
-
- 字符设备架构
-
- 文件
- DRIVER_ATTR()
帮我们创建一个state文件加点的一个宏,(/sys/) find命令找个这个文件
通过 echo 1 > state
三、抓包工具的使用
参考以下文章:
-
- 软件的使用
-
- 学会分析数据包
-
- ping
-
- ftp
-
- QQ数据包
-
4000 4001 8000 8001
彭老师,关于您的“C代码解析网络数据包”文章:
假设文章中展示的数据包是在 Linux 服务器(LANG=UTF-8)中使用 tcpdump 抓取的来自于使用 GBK 编码的 Windows 客户端 TCP 报文,那么,数据包中“应用数据”部分是否还是保持 GBK 编码格式?另外,当数据包通过 DMA 进入内存过程中是否会被转变为 Unicode 编码呢?还是后续在应用层根据环境变量 LANG=UTF-8 对用户数据进行解码,从而导致可能的乱码出现?
还请大神拨冗指点。谢谢!!!