作者james732 (james732)
看板C_and_CPP
标题Re: [问题] Embedded C&C++ 入门书或课程
时间Wed Sep 23 18:26:41 2020
我觉得embedded看规模与需求,大概会有几个层次
1.没有任何os,可能只有一个 while (1) 循序处理与一些中断处理
学生时代会写的8051点亮LED之类的程式就是这种
我现在的工作也是这样的
主要就是在RAM与ROM都极少的情况下
与外部的Hardware做一些不会非常复杂非常即时的交互
在这个架构下,最主要的挑战应该是怎麽在有限资源达到需求
并且在没有os帮忙调度的情况下,各功能要怎麽协调
另外就是要怎麽透过register与晶片的硬体做互动
但这个部份每个系列的晶片都不同
而且厂商通常会提供sample code使用
但不幸sample code不符合需求或有bug时
就会需要研究相关的datasheet
因为没有OS或任何的软体框架,基本上Code也很好写,爱怎麽写就怎麽写
直接在逻辑里存取硬体暂存器也没人会阻止你
但如果有需要跨晶片的需求,就要考虑适当的切分软硬体逻辑
2.有一个简单的multi-task调度,或者使用一个RTOS
Google Chomebook所使用的EC (Embedded Controller) 就是这样的
https://chromium.googlesource.com/chromiumos/platform/ec/
它虽然没有使用现有的RTOS,但它也实作了相关的context switch机制
这种情况下就是要在现有的软体架构下再去新增或修改
可能是与硬体有关,或者与硬体无关的部份,框架会切得比较明确
如果是硬体有关,就要去研读硬体的datasheet,并实作相关的API
如果是硬体无关,就要看软体的逻辑怎麽做,并呼叫已有的API
跟1比起来,这种就是会用在比较复杂、即时、需要类似multi-task的情况
第一个难点会是要先弄懂它所使用的软体框架现有的规则与限制
然後就看你是要写偏向软体或者偏向硬体,或者一个全新贯穿软硬体的东西
3.直接以Linux Kernel为基底
这个写起来就会跟你拿台PC灌Linux写程式的感觉有点像了
但如果使用的embedded硬体是现有Linux kernel不支援的话
就要自己看datasheet然後去实作相关的Kernel module
这个难点就是跟Linux相关的部份,要怎麽跟核心正确的互动等等
如果是写应用端的话,跟PC写的感觉应该会非常像了
我觉得embedded system非常看「应用」
同样是点个红绿灯,你可以写个 while (1) 加上 sleep 就做到
你也可以弄个linux kernel然後从gpio driver写到application (有人会这样干吗)
但我觉得有几个基本功应该都躲不掉
1.关於C语言本身,特别是指标的部份,不管哪种一定都会用
2.关於OS的基本概念,除了while (1) 型的以外都会很吃重
3.晶片硬体的基本概念,譬如register怎麽写,你要把一根pin拉high要怎麽拉等等
4.中断(interrupt)流程的概念与处理,这绝对是会用到的(感谢板友建议)
一般来说,不管是哪种架构,操作硬体的程式码应该都会有C语言的API
如果不幸没有,自己写的话,读写暂存器大概也不一定要用到组合语言
除非是非常需要最佳化,或者一些C语言真的翻不出来的东西,才要用组语
因此我觉得学习好C语言会是非常重要的
如果是想练功的话,就可以买个开发板回来玩玩看
最简单的LED、按键,到复杂的点亮萤幕、处理camera,能玩的东西非常多
基本概念有了,就算换个晶片,细节不同,大致上的道理还是互通的
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.71.212.152 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1600856804.A.056.html
1F:推 s4300026: 赞 09/23 18:49
2F:推 rain45: 简单明了推 09/23 21:06
3F:推 Dinowchang: 写得很棒,建议基本功再加一个中断 09/23 21:26
感谢建议,已加上
※ 编辑: james732 (111.71.212.152 台湾), 09/23/2020 22:11:42
4F:→ petercoin: GPIO完了之後就是I2C,SPI,UART等等的使用了吧 09/24 08:46
5F:→ TuringNTU: 真的谢谢大大优秀的回文 09/24 14:52
6F:推 EdisonX: 写51和 driver porting 或改kernel 深深认知是不同领域 09/27 17:33