从嵌入式软件开始金宝愽备用网址

跟随导师
科林·沃尔斯

科林·沃尔斯

12月10日邮寄,二千零一十八

我经常收到对嵌入式软件感兴趣的工程师的询问——通常是电子邮件。金宝愽备用网址他们询问他们应该学习什么,需要什么编程语言等等。我希望能有所帮助,并且通常发送对这些查询的答复。然而,我认为,在博客帖子中封装一些指导可能会有所帮助……

首先,我不太确定我是否是刚开始讨论这个问题的合适人选。为了我,这种经历是很久以前的事了,我写过在这里.已经说过,也许我还能给点建议。最后,像任何技术工作一样,获得一个嵌入式软件开发团队的职位是一个拥有合适的技能集和一些经验的问金宝愽备用网址题。

经验问题是一个棘手的问题。在找第一份工作时,你怎么会有经验?一些雇主很开明,能够理解这个问题,并接受一定数量的招聘人员将会绿色“.获得经验的最好方法是获得实习机会。不花钱工作)或者从事个人项目,确保你有一个好故事要讲。

定义技能集没有那么模糊,虽然某些特定的东西比其他的更适用于某些行业。也,嵌入式软件开发团队不是由金宝愽备用网址一群具有相同技能和知识的工程师组成的;一些意志,例如,有较多的硬件接口经验,而其他人可能知道网络协议或设备的应用领域。任何人都不太可能拥有开发项目每个方面的所有必要先决条件。

所以,以下是我要解决的一些关键问题:

  • 学习C它是开发嵌入式软件最常用的语言,为学习其他语言提供了合理的基础。金宝愽备用网址
  • 您可能希望熟悉一些关注安全使用C的标准——比如MISRA C。
  • 学习一些关于实时操作系统的知识——也许Linux也是。
  • 学习一些基本的电子知识。你不需要能够设计芯片,但是理解,例如,为什么当按下按钮时金宝愽备用网址,您的软件可能会看到0[而不是1]可能是有用的。
  • 学习一些汇编语言。即使你真的或从来没有编码它汇编程序,能够阅读它是有用的。

杰克·甘斯尔有一些有趣的东西意见在这个话题上。

虽然你可以参加嵌入式开发课程——那里有很多优秀的公司——但是还有很多其他的资源可用。读书是可能的。虽然我声称要创作第一本关于嵌入式软件的书(1986年——现在不完全相关),并计划明年再出版一本,金宝愽备用网址有很多可供选择的。当然,有无数的在线资源。一个好的起点是嵌入式.com我经常写作的地方,和许多知识渊博的作家一起。

嵌入式软件的一个特定增长领域是汽车系统。金宝愽备用网址在大多数情况下,技能不变,但是熟悉AUTOSAR和OSEK/VDE可能很有用。

如果您有任何学习建议或需要关于特定资源的建议,留下评论或联系电子邮件或者通过社交媒体。

更多博客帖子

关于科林·沃尔斯 关注推特

科林·沃尔斯我在电子行业有三十多年的经验,主要致力于嵌入式软件。金宝愽备用网址经常在会议和研讨会上做演讲,撰写许多技术文章和两本关于嵌入式软件的书,金宝愽备用网址我是导师图形嵌入式系统部的营销团队的成员,我总部设在英国。远离工作,我兴趣广泛,包括摄影,并试图把我的两个女儿引向正确的人生方向。包括他的卡拉OK歌曲和英国最好的部分:http://go.mentor.com/3_acv

2评论

发表评论
卡基 12月14日下午2:33发表评论,二千零一十八
浮点IOHWAB_FLOAT32的#include#include#includetypedef;char LV_Indicator_GPO='R',HV_Indicator_GPO='Y',HT_Indicator_GPO='G';类型化结构{IOHWAB_FLOAT32电池_电压转换;IOHWAB_FLOAT32温度传感转换;}iohw_AdcDataConverted;//各种车辆状态的枚举.typedef枚举Vehicle_Stat{eLOCK_0=0,eOFF_1=1,eACC_2=2,EONY4=4,eSTART_5=5,eSNA_7=7,};//高阈值的枚举,低压和高温.typedef enum Thres._Value{eTHRESHOLD_TEMPREATURE_HIGH_40=40,eTHRESHOLD_VOLTAGE_HIGH_15=15,eTHRESHOLD_VOLTAGE_LOW_9=9,};//对信号.enum eBoolean_State{eHIGH=1,ELOW=0,};无效SWC_Rte_Write_high_._Indication(bool onoff);无效SWC_Rte_Write_._Volatge_Indication(bool onoff);无效SWC_Rte_Write_._Volatge_Indication(bool onoff);无效SWC_Rte_Read_R_AdcDataConverted_AdcDataConverted(iohw_AdcDataConverted*datadata);int SWC_Rte_Read_Ign_Stat();无效SWC_GPO_Selection();int main(void){system("“清楚”;Primtf(“ttt*******************申请开始*******************”;SWC_GPO_Selection();if((LV_Indicator_GPO==HV_Indicator_GPO)&(LV_Indicator_GPO==HT_Indicator_GPO)){printf("%c GPO被设置为所有三个指标。”,HT_Indicator_GPO;}.{printf("n%c:低压指示器n%c:高压指示器n%c:高温指示器,LV_Indicator_GPO,HV_Indicator_GPO,HT_Indicator_GPO;}iohw_AdcDataConverted Input_Parameter_ADC;int Vehicle_Ignition_Stat;//车辆点火状态|例如。锁定=0,OFF=1,ACC=2,on=4,开始=5,SNA=7Vehicle_Ignition_Stat=SWC_Rte_Read_Ign_Stat();//Vehicle_Ignition_Stat=Rte_Read_Ign_Stat(c03_ISw_Stat ign_state);在您获得正确的点火状态eif(Vehicle_Ignition_Ig点火_Stat=Vehicle_Ig点火_Stat=Vehicle_Ig点火_ELOCK_0.|eLOCK_ELOCK_0.|Vehicle_Ig ELOCK_Stat =Vehicle_Ig点火_Stat==eVehicle_Ig点火_Ig点火_VVehicle_Ig点火_Stit==eVehicle_Ig_Ig_Ig_Ig点火_Vehic_Vehic_Vehic_Ig_Ig_Vehic_Ig_Vehic_Vehic_Ig_IgIg_Ig_Ig_Ig_Ig_Ig_Ig_VeVehic_eSNA_7){如果(Vehicle_Ignition_Stat==eON_4)//Vehicle处于ON状态{//All GPO设置为high.printf("点火模式:将所有GPO设置为高;SWC_Rte_Write_._Volatge_Indication(eHIGH);SWC_Rte_Write_._Volatge_Indication(eHIGH);SWC_Rte_Write_high_._Indication(eHIGH);}.{SWC_Rte_Read_R_AdcDataConverted_AdcDataConverted(&Input_Parameter_ADC);如果(Input_Parameter_ADC.Battery_Vol.ConvertedeTHRESHOLD_VOLTAGE_HIGH_15){SWC_Rte_Write_._Volatge_Indication(eHIGH);//高压指示}否则{//GPO状态关闭,因为电压处于安全限制SWC_Rte_Write_._Volatge_Indication(eLOW);SWC_Rte_Write_._Volatge_Indication(eLOW);Primtf(“系统电压处于安全极限。”;}如果(Input_Parameter_ADC.TempSenseConverted>eTHRESHOLD_TEMPREATURE_HIGH_40){SWC_Rte_Write_high_._Indication(eHIGH);//高温指示}否则{//GPO状态关闭,因为温度处于安全限制SWC_Rte_Write_._Temperature_Indication(eLOW);Primtf(“系统温度处于安全极限。”;}}.{printf("你进入的车辆点火状态不正确,请选择正确的点火状态n LOCK=0,OFF=1,ACC=2,on=4,开始=5,SNA=7 \n;返回0;}无效SWC_Rte_Write_._Temperature_Indication(bool onoff){if(onoff==1){if(HT_Indicator_GPO='R')printf("高温观察:HT RED LED:ON;否则,如果(HT_Indicator_GPO=='Y')printf("高温观测:高温黄光LED:ON;否则,如果(HT_Indicator_GPO=='G')printf("高温观察:高温绿色LED:ON;elseprintf("n无效GPO选择。”;}elseprintf("未观测到高温;}无效SWC_Rte_Write_._Volatge_Indication(bool onoff){if(onoff==1){if(LV_Indicator_GPO='R')printf("低电压观察:LV红色LED:ON;否则,如果(LV_Indicator_GPO=='Y')printf("低电压观察:LV黄色LED:ON;否则,如果(LV_Indicator_GPO=='G')printf("低电压观察:LV绿色LED:ON;elseprintf("n无效GPO选择。”;}elseprintf("没有观察到低压。”;}无效SWC_Rte_Write_._Volatge_Indication(bool onoff){if(onoff==1){if(HV_Indicator_GPO='R')printf("观察高压:高压红光LED:ON;否则,如果(HV_Indicator_GPO=='Y')printf("高压观察:高压黄光LED:ON;否则,如果(HV_Indicator_GPO=='G')printf("观察高压:高压绿色LED:ON;elseprintf("n无效GPO选择。”;}elseprintf("未观测到高压;}无效SWC_Rte_Read_R_AdcDataConverted_AdcDataConverted(iohw_AdcDataConverted*data){system("“清楚”;Primtf(“nEnter电压和温度的虚拟值:;斯坎夫%f% f,&data->电池电压转换,&data->TempSenseConverted;}int SWC_Rte_Read_Ign_Stat(int Ignition_State){printf("\n请选择点火模式\n锁=0,OFF=1,ACC=2,on=4,开始=5,SNA=7 \n;斯坎夫%D”,&Ignition_State;返回点火状态;}无效SWC_GPO_Selection(){system("“清楚”;8t选择;Primtf(“有三个GPO,即:红色,黄色的,绿色“;Primtf(“n您可以根据自己的选择配置它们:任何GPO都可以配置为HV,吕高温指示器。”;Primtf(“请输入低压指示器的GPO选项\nPress 1表示红色GPOnPress 2表示黄色GPOnPress 3表示绿色GPO\t”;斯坎夫%D”,与选择;开关(选择){情况1:{LV_Indicator_GPO='R';Primtf(“请选择高压指示器\nPress 1表示红色GPOnPress 2表示黄色GPOnPress 3表示绿色GPO\t”;斯坎夫%D”,与选择;切换(选择){情况1:HV_Indicator_GPO='R';HT_Indicator_GPO='R';断裂;病例2:HV_Indicator_GPO='Y';HT_Indicator_GPO='G';断裂;病例3:HV_Indicator_GPO='G';HT_Indicator_GPO='Y';断裂;default:printf("nInvalid Choice:请重新配置n”;SWC_GPO_Selection();断裂;}断裂;病例2:{LV_Indicator_GPO='Y';Primtf(“请选择高压指示器\nPress 1表示红色GPOnPress 2表示黄色GPOnPress 3表示绿色GPO\t”;斯坎夫%D”,与选择;切换(选择){情况1:HV_Indicator_GPO='R';HT_Indicator_GPO='G';断裂;病例2:HV_Indicator_GPO='Y';HT_Indicator_GPO='Y';断裂;病例3:HV_Indicator_GPO='G';HT_Indicator_GPO='R';断裂;default:printf("nInvalid Choice:请重新配置n”;SWC_GPO_Selection();断裂;}断裂;情况3:{LV_Indicator_GPO='G';Primtf(“请选择高压指示器\nPress 1为红色GPOnPress 2为黄色GPOnPress 3为绿色GPO\t”;斯坎夫%D”,与选择;切换(选择){情况1:HV_Indicator_GPO='R';HT_Indicator_GPO='Y';断裂;病例2:HV_Indicator_GPO='Y';HT_Indicator_GPO='R';断裂;病例3:HV_Indicator_GPO='G';HT_Indicator_GPO='G';断裂;default:printf("nInvalid Choice:请重新配置n”;SWC_GPO_Selection();断裂;}断裂;default:printf("无效选择;SWC_GPO_Selection();断裂;}
卡基 12月14日下午2:36发表评论,二千零一十八
#include#include#include#include#include#includeenum Vehicle_Stat{NORMAL=1,配置=2,};enum Boolean_State{HIGH=1,低= 0,};无效SWC_Rte_Write_Fa._Indication(bool onoff);无效SWC_Rte_Call_C_PwmDuty_PwmOperaion(uint8_t*Duty_.);void SWC_Initialization(uint8_t Initialization_Time);空SWC_Delay(浮动秒);无效SWC_Warning_Lamp_Configuration();int main(void){system("“清楚”;Primtf(“ttt******申请开始***”;uint8_t._._temp;uint8_t Initialization_time_temp;Primtf(“\n选择车辆模式。t 1。正常模式。T 2。配置模式。“;uint8_t车辆模式;斯坎夫%D”,&Vehicle_.;如果(Vehicle_.==NORMAL){printf("车辆处于正常模式。”;Primtf(“\n默认情况:;SWC_Rte_Write_Fa._Indication(LOW);Primtf(“\n输入初始化后(在第二)GPIO将打开和关闭的时间:;斯坎夫%D”,&Initialization_time_temp);SWC_Initialization(Initialization_time_temp);SWC_Warning_Lamp_Configuration();}否则如果(Vehicle_.==CONFIGUR.){printf("车辆处于配置模式。”;SWC_Rte_Call_C_PwmDuty_PwmOperaion(&._._temp);}.{printf("无效选择。”;返回0;}无效SWC_Rte_Write_Fa._Indication(bool onoff){system("“清楚”;如果(onoff==LOW){printf("警告灯状态:关闭;}.{printf("警示灯状态:开启;}空SWC_Delay(float.){float mili_.=1000000*(.);._t start_time=.();(.()=0;i--{系统("“清楚”;SWC_Rte_Write_Fa._Indication(HIGH);SWC_延迟(0.5);SWC_Rte_Write_Fa._Indication(LOW);SWC_延迟(0.5);//Primtf(“n时间剩余:%d”,i);//Primtf(“n初始化开始:%d秒剩余。”,i);//.(Initialization_Time);PrtTf(“\n初始化时间超过。”;}无效SWC_Rte_Call_C_PwmDuty_PwmOperaion(uint8_t*Duty_.){uint8_t周期;Primtf(“\n以百分比(从0到100)输入占空比:;斯坎夫%D”,工作循环;if(*Duty_.)>=0&&(*Duty_.)<=100){printf("输入周期:;斯坎夫%D”,&周期性;Primtf(“\n责任周期为%d%。”,*责任周期;Primtf(“n周期为%d HZ。”,周期性;按时浮动,业余时间;On_Time=(float)(*Duty_.)/(100*周期性);Off_Time=(float)(100-(*Duty_.))/(100*周期性);//On_Time+Off_Time=1(对于1HZ频率)printf("nOn time是%f,off time是%f”,一次,业余时间;.(1){system("“清楚”;SWC_Rte_Write_Fa._Indication(HIGH);SWC_Delay(Off_Time);SWC_Rte_Write_Fa._Indication(LOW);SWC_Delay(On_Time);}.{printf("\n无效的责任周期。注意:工作周期必须在0-100之间。);}无效SWC_Warning_Lamp_Configuration(){uint8_t选择;Primtf(“\n请配置GPIO,通过该GPIO可以检测到故障。n 1..Hardwarett2..CAN\t3...t”;斯坎夫%D”,与选择;切换(选择){情况1:{printf("\n警告灯被配置为通过硬件检测故障。”;Primtf(“n您可以通过硬件启用或禁用警告灯。n请选择一个选项。1。启用WLt 2。禁用WLt 3。不感兴趣;斯坎夫%D”,与选择;开关(选择){情况1:SWC_Rte_Write_Fa._Indication(HIGH);断裂;病例2:SWC_Rte_Write_Fa._Indication(LOW);断裂;病例3:断裂;default:printf("n无效选择。”;断裂;}断裂;情况2:printf("\n警告灯配置成通过CAN检测故障。”;断裂;情况3:printf("\n警告灯配置成通过硬件和CAN检测故障。”;断裂;default:printf("n无效选择。”;SWC_Warning_Lamp_Configuration();断裂;}

添加您的评论

请填写以下资料以作评论或登录.

您的电子邮件将不会发布

档案室


闲聊γ 接触