开始与嵌入式软件金宝博滚球专家

跟随导师
科林墙

科林墙

12月10日邮寄,2018

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

首先,我不太确定,我是正确的人与谁讨论刚开始。对我来说,这个经验是很久以前的事了,我写了在这里。有说,也许我还可以给一些建议。最后,喜欢任何技术的工作,获得一个嵌入式软件开发团队的职位是一个拥有合适的技能集和一些经验的问金宝博滚球专家题。

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

定义技能比较模糊,虽然具体的事情是比其他人更适用于某些行业。同时,嵌入式软件开发团队不是由金宝博滚球专家一群具有相同技能和知识的工程师组成的;有些人会,例如,有较多的硬件接口经验,而其他人可能了解网络协议或设备的应用领域。很可能有人会有所有必要的先决条件一个开发项目的各个方面。

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

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

杰克Ganssle有一些有趣的意见关于这个主题。

尽管你可以上课在嵌入式开发,有很多优秀的企业,有很多其他资源可用。书是一种可能性。虽然我声称对嵌入式软件编写的第一本书(1986 -现在不完全相关),计划明年另一个,金宝博滚球专家有很多可供选择。当然,网上有无数的资源。一个良好的开端embedded.com我经常写,和许多知识渊博的作家一起。

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

如果你有任何建议或需要学习建议在一个特定的资源,留下你的评论或取得联系吗电子邮件或者通过社交媒体。

更多的博客

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

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

2的评论

发表评论
卡基 评论节12月14日下午2018
浮点IOHWAB_FLOAT32的#include#include#includetypedef;char LV_Indicator_GPO='R',HV_Indicator_GPO = ' Y ',HT_Indicator_GPO = ' G ';类型化结构{IOHWAB_FLOAT32电池_电压转换;IOHWAB_FLOAT32 TempSenseConverted;}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_Temperature_Indication(bool时断时续的);无效SWC_Rte_Write_._Volatge_Indication(bool onoff);空白SWC_Rte_Write_High_Volatge_Indication(bool时断时续的);无效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("% c:\ n \ 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,= 4,开始=5,系统网络体系结构(SNA)= 7 vehicle_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_Low_Volatge_Indication(eHIGH);SWC_Rte_Write_High_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(“\ n系统电压在安全限制。”);}如果(Input_Parameter_ADC.TempSenseConverted > eTHRESHOLD_TEMPREATURE_HIGH_40){ SWC_Rte_Write_High_Temperature_Indication(eHIGH);//高温指示}否则{//GPO状态关闭,因为温度处于安全限制SWC_Rte_Write_._Temperature_Indication(eLOW);Primtf(“系统温度处于安全极限。”);其他}}}{printf ("你进入的车辆点火状态不正确,请选择正确的点火锁状态\ n = 0,OFF=1,ACC = 2,= 4,开始=5,系统网络体系结构(SNA) = 7 \ n”);}返回0;}无效SWC_Rte_Write_._Temperature_Indication(bool onoff){if(onoff==1){if(HT_Indicator_GPO='R')printf("\ n高温观察:HT红了:“);else if (HT_Indicator_GPO = = Y) printf ("\ n高温观察:HT黄色领导:“);else if(HT_Indicator_GPO = = ' G ')printf("\ n高温观察:HT绿色领导:“);elseprintf (“n无效GPO选择。”);}elseprintf (“未观测到高温);}无效SWC_Rte_Write_._Volatge_Indication(bool onoff){if(onoff==1){if(LV_Indicator_GPO='R')printf("\ n低压观察:LV红了:“);else if(LV_Indicator_GPO = = Y)printf("低电压观察:LV黄色LED:ON);else if (LV_Indicator_GPO = = ' G ') printf ("低电压观察:LV绿色LED:ON);elseprintf (“n无效GPO选择。”);}elseprintf (“没有观察到低压。”);}无效SWC_Rte_Write_High_Volatge_Indication (bool时断时续的){如果(时断时续的= = 1){(HV_Indicator_GPO = = ' R ') printf ("\ n高压观察:高压红了:“);else if(HV_Indicator_GPO = = Y)printf("高压观察:高压黄光LED:ON);else if(HV_Indicator_GPO = = ' G ')printf("\ n高压观察:高压绿色领导:“);elseprintf (“n无效GPO选择。”);}elseprintf (“高\ n Volatge没有观察到的”);}无效SWC_Rte_Read_R_AdcDataConverted_AdcDataConverted(iohw_AdcDataConverted *数据){系统(““清楚”);Primtf(“电压和温度\整体虚拟价值:“);斯坎夫%f% f,与数据- > Battery_VoltageConverted,&data->TempSenseConverted;}int SWC_Rte_Read_Ign_Stat(int Ignition_State){printf("\n请选择点火模式\n锁=0,OFF=1,ACC = 2,= 4,开始=5,系统网络体系结构(SNA) = 7 \ n”);斯坎夫%D”,&Ignition_State);返回Ignition_State;}无效SWC_GPO_Selection(){系统(““清楚”);uint8_t选择;Primtf(“有三个GPO,即:红色,黄色的,绿色”);Primtf(“n您可以根据自己的选择配置它们:任何GPO都可以配置为HV,吕高温指示器。”);Primtf(“\ nPlease输入GPO选择低电压指示器\ nPress 1红色GPO \ nPress 2黄色GPO \ nPress 3绿色GPO \ t”);斯坎夫%D”,与选择;开关(选择){案例1:{ LV_Indicator_GPO = ' R ';Primtf(“请选择您的GPO选择高电压指示器\ nPress 1红色GPO \ nPress 2黄色GPO \ nPress 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 ';断裂;默认值:printf("nInvalid Choice:请重新配置n”);SWC_GPO_Selection();断裂;}断裂;案例2:{ LV_Indicator_GPO = ' Y ';Primtf(“请选择您的GPO选择高电压指示器\ nPress 1红色GPO \ nPress 2黄色GPO \ nPress 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';断裂;默认值:printf("nInvalid Choice:请重新配置n”);SWC_GPO_Selection();断裂;}断裂;案例3:{LV_Indicator_GPO = ' G ';Primtf(“请选择GPO选择高电压指示器\ nPress 1红色GPO \ nPress 2黄色GPO \ nPress 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 ';断裂;默认值:printf("nInvalid Choice:请重新配置n”);SWC_GPO_Selection();断裂;}断裂;默认值:printf("无效的选择”);SWC_GPO_Selection();断裂;} }
卡基 12月14日下午2:36发表评论,2018
#include#include#include#include#include#includeenum Vehicle_Stat{NORMAL=1,配置=2,};enum Boolean_State{HIGH=1,低= 0,};空白SWC_Rte_Write_Fault_Indication(bool时断时续的);空白SWC_Rte_Call_C_PwmDuty_PwmOperaion (uint8_t * Duty_cycle);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 Vehicle_Mode;斯坎夫%D”,&Vehicle_Mode);如果(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();} else if(Vehicle_Mode = =配置){ printf("车辆处于配置模式。”);SWC_Rte_Call_C_PwmDuty_PwmOperaion (&duty_cycle_temp);}.{printf("无效选择。”);}返回0;}无效SWC_Rte_Write_Fault_Indication(bool时断时续的){系统(““清楚”);如果(onoff==LOW){printf("警告灯状态:关闭);}.{printf("警示灯状态:开启);}}无效SWC_Delay(浮点数秒){浮动mili_second = 1000000 *(第二次);._t start_time=.();而(时钟()= 0;我——){系统(““清楚”);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);}printf ("\ 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(“% d % \ n责任周期。”,* Duty_cycle);Primtf(“\ n % d周期性赫兹。”,周期性;按时浮动,Off_Time;On_Time=(float)(*Duty_.)/(100*周期性);Off_Time =(浮动)(100 -(* Duty_cycle))/(100 *周期性);//On_Time+Off_Time=1(对于1HZ频率)printf("nOn time是%f,off time是%f”,一次,Off_Time);(1){系统(““清楚”);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。使王\ t 2。禁用西城\ t 3。不感兴趣);斯坎夫%D”,与选择;开关(选择){案例1:SWC_Rte_Write_Fault_Indication(高);断裂;病例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();断裂;} }

添加您的评论

请完成以下信息或发表评论登录

您的电子邮件将不会发布

档案室


聊天| 联系