└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Arbeitsanfanger-fuer-Embedded-Entwicklung 2 | <嵌入式软件开发岗,必备入职前技能培训计划> 3 | --- 4 | # 入职前准备工作: 5 | - 教材电子书链接:https://pan.baidu.com/s/1YOM_Q6Bgyj7XthUYBQnDbA 6 | - 提取码:vkkp 7 | ### 一. C语言 8 | - C Primer Plus 9 | - C和指针 10 | 11 | ### 二. 数据结构和算法(基础四大件1) 12 | - 大话数据结构,剑指offer,刷题。 13 | 14 | ### 三. 操作系统(基础四大件2) 15 | - 进程和线程 并发 和锁 内存分布调度等等 (深入理解操作系统) 16 | ### 四. 计算机网络和设计模式(基础四大件3 & 4) 17 | - tcp/ip 协议栈(tcp/ip详解) 18 | - 单例 工厂 代理 策略模式 模版方法(大话设计模式) 19 | ### 五.实践 20 | - Linux操作系统掌握: shell编程 脚本等等(鸟哥的Linux私房菜 或 Linux就该这么学) 21 | - 文档名称:《Linux速查备忘手册》 22 | - 下载链接: https://pan.baidu.com/s/1Xub98JU3rBIoYiUgn8AOgg 23 | - 提取码: x6we 24 | - 文档名称:《Linux命令行大全》 25 | - 下载链接: https://pan.baidu.com/s/1FeXNKFTm2sWKB-934zlgfQ 26 | - 提取码: fm5q 27 | - 编译/调试工具: Linux平台上 gcc 以及makefile(跟我一起写makefile)要会写 gdb调试工具 28 | - 英语好的看GNU官方关于GCC和GDB的官方文档。中文版《debugging with gdb》,跟我一起写makefile 29 | 30 | ### 五. 华为培训视频 31 | --- 32 | 33 | 34 | # 必备技能大纲 -- 嵌入式软件工程师: 35 | 1. 嵌入式软件编程基础阶段 36 | - 编程语言基础 --> 很重要!必须要从头搞透他! 37 | + C语言编程基础 38 | + 特别是C语言中对指针的理解和应用 39 | + 指针,数组,结构体,函数,这些简单的至少得会,要能写出来 40 | - 常见的数据结构和算法 41 | + Leetcode继续刷题 with C语言 42 | - 开发环境 -- Linux 43 | + Linux系统的基本应用 44 | + Linux常用命令 45 | 2. 真正嵌入式编程几段 46 | - 学习ARM体系结构编程(这一阶段才是真正的嵌入式编程) 47 | + 选择一款嵌入式CPU(目前ARM嵌入式CPU应用最广泛)和嵌入式开发平台 48 | * 学习嵌入式CPU的裸机/逻辑编程 49 | * 熟悉中断、定时器、串口、NANDFLASH、网络控制器、LCD屏、触摸屏等常用外围设备硬件工作原理 50 | * 如何使用C语言来编程、控制这些硬件 51 | + 嵌入式硬件知识体系 52 | - 硬件工作原理 53 | - 模拟电路、数字电路、微机原理和单片机 54 | - 重点要看CPU芯片手册 55 | + 英语很重要!!! 56 | 3. 嵌入式系统构建阶段 57 | - 学习带有操作系统的嵌入式系统构建 58 | + 系统启动流程 59 | + Bootloader的工作流程 60 | + UBOOT的编译 61 | + 裁剪与移植 62 | + 嵌入式Linux内核的裁剪、移植与编译 63 | + 嵌入式根文件系统的定制、BootLoader、内核和根文件系统的烧写 64 | - 此阶段目的是掌握带有操作系统的嵌入式系统的构建和烧写过程,以及对嵌入式系统软件的总体构成有个整体认识,为接下来学习嵌入式应用和驱动开发打下坚实基础 65 | 4. 学习嵌入式Linux应用程序开发 66 | - 基于Linux多进程、多线程、网络、文件与目录 67 | - QT编程 68 | 5. 学习嵌入式Linux驱动程序开发 69 | - 学习底层嵌入式Linux设备驱动程序开发设计 70 | + 常用的字符设备驱动 71 | + 块设备驱动 72 | + LCD设备驱动 73 | + 触摸屏设备驱动 74 | + 驱动程序开发中的核心技术 75 | 6. 基于嵌入式Linux平台实现的飞行器、智能机器人等综合的嵌入式实训项目 76 | - 综合应用了嵌入式开发当中的应用、驱动和QT开发技术 77 | 78 | 79 | 7. 摘录自网络: 80 | 这里只讲大公司的必备技能 81 | - 非常扎实的C语言功底 82 | - 能基本看懂PCB硬件原理图,怎么也得知道哪些引脚是相接的吧 83 | - 基本的驱动需要知道,比如PWM、串口、iic、SPI、DMA等,这些其实都不难 84 | - 需要了解基本的网络协议,比如TCP三次握手,ARP协议、DHCP协议、ICMP协议、静态IP和动态IP的区别等 85 | - 代码管理工具比如git或者svn,git功能多但用不好就心烦,svn简单但操作错误就蛋疼 86 | - 4级英语怎么也得过了吧 87 | - 其他的技能针对不同公司不同工种所需,进公司后自然会有人教你 88 | - 有一个不是必要的但至关重要的是**算法**和**数据结构**,这个基础牢固干啥都不虚 89 | 8. 嵌入式开发干货教程,网络资源 90 | - https://www.crifan.com/files/doc/docbook/embedded_soft_dev/release/html/embedded_soft_dev.html#emb_industry_2014_education_background 91 | 9. !!!嵌入式精品学习资源,网络资源 92 | - 程序羊自制网站:www.r2coding.com 系统、简洁、全面、干货!!! 93 | 10. C语言最全入门笔记 94 | * https://mp.weixin.qq.com/s?__biz=MzI4MTEyNDU1MA==&mid=2651208510&idx=4&sn=ad21c8f2d1df399b96cc00851b1919c6&chksm=f05c9097c72b19815e9c08a9ef918850c26693358e3fdf4238ea1dccb0de8862f99f87643ec1&scene=132#wechat_redirect 95 | 96 | # 学习规划 97 | ## 内容规划 98 | - [ ] 1. 深入了解嵌入式开发岗位职能,所需**技术栈** 99 | - [ ] 2. C语言基本语法 100 | - [ ] 3. C语言进阶,教学视频 + 一两个项目实践应用 101 | - [ ] 4. Github C语言开源项目,嵌入式相关 102 | 103 | ## 时间规划 - 毕业论文 104 | - [x] **1. 06.Dec.2021 - 12.Dec.2021** 105 | - [x] - 上交多体运动学模型计算 106 | - [x] - 修正代码 107 | - [x] - 约导师试验田Termin 108 | - [x] **2. 14.März.2022** 109 | - [x] - Arbeit abzugeben 110 | - [x] **3. 06.Apr.2022** 111 | - [x] - Diplomverteidigung 112 | --- 113 | # 学习笔记 114 | ## 摘录1 115 | 116 | #### Thema 1: C语言--嵌入式底层开发工程师 117 | 118 | >学习C语言也是一样,尤其是对于嵌入式底层工程师来说,我们要学习的不仅仅是C语言的基本语法,更重要的是如何通过C语言这个工具,去理解我们的计算机系统、CPU架构: 119 | > 120 | > 1)程序到底是如何编译、 链接、和运行的? 121 | > 122 | > 2)运行时各种代码段、数据段、BSS段、堆栈在内存中如何分布,如何管理的? 123 | > 124 | > 3)程序在不同的平台(ARM、X86)、裸机环境或有OS的环境(linux、uc/os等)有何不同? 125 | > 126 | > 4)静态链接与 动态链接的过程有何差异,为什么要使用动态链接?共享库? 127 | > 128 | > 5)不同的开发平台、IDE、编译器,C语言的编程有何差异和不一样的地方,如何做到跨平台、增强程序的可移植性和鲁棒性? 129 | > 130 | > 6)各种变量名、函数名、数组名、指针的本质是什么?编译器是如何处理的? 131 | > 132 | >搞懂了这些语言背后计算机系统知识,还远远不够,还要去学习操作系统相关的知识:进程、线程、中断、内存管理 133 | > 134 | >对于嵌入式开发来 说,还要学习ARM等处理器架构知识、GCC编译器对C标准的各种扩展,各种生僻的用法,否则你去看linux内核代码、驱动代码,总感觉“怪怪的”,好像哪里不对,跟平时的C语言不太一样,感觉自己学的是一门假C语言...... 135 | > 136 | >C语言的精华是内存、存储管理。各种隐藏很深的bug其实也跟内存有关:内存越界、内存泄露、野指针等等,一个不经意的疏漏,就可能阴沟里翻船。就是有多年工作经验的工程师也不敢保证自己写的代码一定没有问题。C语言默认大家都是大牛、计算机专家,可惜现实中往往太多挖坑小能手,太多猪一样的队友。如何养成良好的编程习惯,避免各种bug,也是C语言进阶学习的一个重点。 137 | > 138 | >为了测试一下你对C语言的掌握程度,下面的几个测试题,可以自我测试一下,检测一下自己的C语言水平,是否达到嵌入式工程师(尤其是内核驱动工程师)的要求: 139 | > 140 | >1)你对以下C语言的基本概念是否掌握?是否能用一句话概括出来? 141 | ``` 142 | 标识符、关键字、预定义标识符、分隔符、语法检查、语义检查、 143 | 表达式、语句、左值、对象、结合性、左结合右结合、未定义行为 144 | ``` 145 | >2)一个sizeof(int)引发的思考 146 | ``` 147 | •sizeof是函数吗?是关键字?预定义标识符? 后两者有何区别? 148 | •在32位和64位的Windows7系统下,结果分别是多少? 149 | •在32位和64位X86 CPU系统下,结果分别是多少? 150 | •在8位、16位、32位ARM系统环境下运行结果分别是多少? 151 | •在Turbo C、keil、GCC-32、GCC-64开发环境下,结果是多少? 152 | •使用gcc –m32生成一个32位代码,运行在64位环境下,结果? 153 | 使用gcc –m64生成一个64位代码,运行在32位环境下,结果? 154 | ``` 155 | 156 | >3)自增运算符带来的思考 157 | ``` 158 | //下面一段程序,在不同的编译器上编译,结果是多少,一样吗?为什么? 159 | i=1,j=2; 160 | printf(“%d\n”, i++*i++); 161 | i+++j; 162 | ``` 163 | 164 | >4)代码分析: 使用tc、C-free、GCC、VC++6.0、visual studio分别编译下面代码,会出现什么问题? 165 | ``` 166 | int main() 167 | { 168 | int i; //定义一个变量 169 | int a[0]; 170 | printf("hello world!\n"); 171 | int j; 172 | for(int k=0;k<10;k++); 173 | return 0; 174 | } 175 | ``` 176 | 177 | >5)在linux环境下,运行下面代码,会出现什么问题? 178 | ``` 179 | int * data_copy ( int *p) 180 | { 181 | int buffer[8192*1024]; 182 | memcpy ( buffer, p, 8192*1024); 183 | return buffer; 184 | } 185 | ``` 186 | >6)下面是linux内核代码的一部分(摘自Linux4.4内核),你能看懂多少? 187 | ``` 188 | #define stamp(fmt, args...) pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args) 189 | #define container_of(ptr, type, member) ({ \ 190 | const typeof(((type *)0)->member) * __mptr = (ptr); \ 191 | (type *)((char *)__mptr - offsetof(type, member)); }) 192 | struct urb { … struct usb_iso_packet_descriptor iso_frame_desc[0];} 193 | urb->transfer_flags &= ~(URB_DIR_MASK | URB_DMA_MAP_SINGLE |URB_DMA_MAP_PAGE ); 194 | ``` 195 | 196 | #### Thema 2: C语言--指针和变量 197 | >C语言的指针和实体之间的关系。就像钥匙和房子本身之间的关系。 198 | > 199 | >且对应的变量,比如结构体有几个值,或者实体占用空间的大小几个字节?就像普通的房子的内部结构占的大小。比如两房或三房,更大的话那就快变成别墅了。 200 | > 201 | >普通使用者想要使用指针,就像在一个小区里很多房子不知道要去哪里。拿了指针就像知道了你的房间的地址,获得楼栋号码,就可以拿着钥匙去找到你要的房间地址了。 202 | 203 | 204 | --- 205 | *Zustand: 14.04.2022* 206 | --------------------------------------------------------------------------------