Re: [问题] Embedded C&C++ 入门书或课程

楼主: james732 (好人超)   2020-09-23 18:26:41
我觉得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,能玩的东西非常多
基本概念有了,就算换个芯片,细节不同,大致上的道理还是互通的
作者: s4300026 (s4300026)   2020-09-23 18:49:00
作者: rain45 (润)   2020-09-23 21:06:00
简单明了推
作者: Dinowchang (Dinow)   2020-09-23 21:26:00
写得很棒,建议基本功再加一个中断
作者: petercoin (彼得币)   2020-09-24 08:46:00
GPIO完了之后就是I2C,SPI,UART等等的使用了吧
作者: TuringNTU (NTU图灵)   2020-09-24 14:52:00
真的谢谢大大优秀的回文
作者: EdisonX (卡卡兽)   2020-09-27 17:33:00
写51和 driver porting 或改kernel 深深认知是不同领域

Links booklink

Contact Us: admin [ a t ] ucptt.com