大学 嵌入式应用开发 学习路线

PS:这个应该算是我人生中第一条博客吧,还是要认真写写的,想了想不知道写什么好就从我现在学的东西上入手吧,希望对你们能有所帮助,这也只是我对这方面的见解,有什么不对的地方可以跟我私下聊,面对错误我还是持“有则改之,无则加勉”的态度的。 

目前我还是本科生,讲的话就拿我目前接触到的知识点来讲吧, 我目前接触到的板子有一个89C51的单片机、内核为ARM cortex-A53的开发板 、ARM cortex-M4核的开发板 还有 什么TI(德州仪器)的CC2430 CC3200的板子,现在主要还是用那块A53的板。


结合我现在所学的内容,我认为嵌入式应用的开发可以分为两个部分:

1.控制为主的应用开发

何为控制,我个人认为就是控制型应用,即通过编写程序直接控制芯片内的寄存器后,使得板上的一些外设得以使用。通过这个我原理,我们可以知道,这种应用可以应用在一些像航拍飞行器,机器人之类的应用。上面我所接触的板子内就有适合这样开发的,低端的有51单片机(89C51),中端的有(CC3200等),高端的有ARM cortex-M 系列的板子,这些原理相近,只要过了学习的门槛,这些板子就一通百通了。

2.服务为主的应用开发

所谓服务,即服务用户,也就是我们通过编写相应的代码,获取想要获取的信息,然后通过程序显示出来。用户也可通过也程序的交互,控制其他外设。我们可以在这样的板上“搭载”上操作系统,方便与用户间的交互,和板内应用间的交互。我现在用的板子(ARM cortex-A53的开发板)就是这样的,我可以在上面放个LINUX(操作系统),也可以放个Android系统,然后我们在这个操作系统的基础上进行编程。

其实上述的板子两种类型的应用差不多都可以做,但是我认为,每款芯片、每个板有它自己的特性,有它自己的注重点,我们需要做的就是选择好适合的芯片,编写好与之对应的应用程序。


所以如果你要选择进入这个领域还是要做好以下基础知识的准备:

一、理论知识

基本电路分析:

在这个部分中,我觉得能看得懂电路图就可以了,当然这部分还是要好好学会比较好,这个算是比较基础的课程了,虽然我自己也没有怎么去学,但是这个在以后学习数电模电有一个可以辅助的作用,沉下心去看没什么难的。

数字电路基础:

在数字电路中我们需要掌握,数进制之间的转换,对高\低电平,上\下降沿的理解,还有二极管、晶体管在数字电路中的作用,差不多就这样吧。

模拟电路基础:

模拟电路的话,还是一样吧,主要还是一些放大电路的理解、二极管、晶体管在模拟电路的作用吧

其实说白了,我们如果是只做应用程序的话,只要知道电路的原理,知道高低电平的意义,能使用就好了。但是如果要在往更远的地方走的话,上述的课程最好能够认真的学一下,真的对自己的很有用。

二、编程知识

C语言:

在C语言这边的话,基础的语句必须要会,什么if语句啊,for语句啊这些都要能够写得出来,而且逻辑不能乱。其次是对于每种数据类型要能够知道它的意义和所占空间大小,知道就好了不用去死记。然后数组啊,指针啊,结构体啊,有很多人都觉得很难,但是自己沉下心来仔细想想其实也就那样。

C++或JAVA(面向对象语言可选,但还是建议学):

之所以会写上C++或JAVA,是因为了解一些面向对象的方法,对自己理解编程会有很大的帮助,我觉得我就这样的,刚开始学习C时,觉得很枯燥乏味(虽然现在也是),在学过Java之后我又去看了遍C,就又有了不一样的见解。我现在使用的板子上就是烧写了一个安卓的系统写了一些简单应用,底层的电路驱动虽然是用C写的,但是在应用层就是用JAVA写的,用处还是蛮大的。

其实我个人认为啊,学习编程语言除了掌握最基础的语法(语句)之外,还需要勤加练习,练习真的很重要,一直看书看资料也没有你自己亲手敲一遍代码来得快,这也是为你以后想解决方案时留下基础吧,所以实践很重要!!实践很重要!!实践很重要!!(划重点,要考的)


三、进阶知识

这部分的内容是我突然想加上去的也算是多个参考吧假设没有兴趣是可以不用往下看了

1.LINUX系统编程

说是说LINUX但是不要被它的名字所骗了,实际上你要上面的知识做铺垫的话,学起来还是很轻松的(仅仅是在嵌入式方面),根据我现在的开发经验,在嵌入式中我们需要掌握简单shell命令的使用、make文件的编写、文件IO操作、多线程间通信、TCP/IP网络编程等(目前我能想到就这些,如果还差了的话我后期补吧)。这些知道怎么用了之后,估计自己手写一个大一点的程序是没问题了

2.Android应用开发

其实我觉得这个没有什么好学的,它所用的语言还是JAVA(目前我接触到的知识中大部分是JAVA的)嘛,有了上面的基础自己拿本书好好看就行了。我安卓主要是用在了板子上,板子上电路的控制用的是JNI其实也就是引用了C语言编写的程序(好像叫什么本地化接口吧)。学学也好,平时没事还可以自己做个小软件来玩玩。

目前我能想到的就这些吧,不行的话以后再补好了


附录 代码

以下的代码仅供参考学习,也就是示例代码

//51单片机
#include "reg52.h"
#include 
#define LED P2
typedef unsigned int u16;
typedef unsigned char u8;
void delay(u16 i)
{
	while(i--);
}
void main()
{
//流水灯
	u8 i;
	 LED=0xfe;//1111 1110
	  delay(50000);
	 while(1)
	 {	 	
		for(i=0;i<7;i++)
		{
			LED=_crol_(LED,1);//循环左移  1111 1101
			delay(50000);
		}
		for(i=0;i<7;i++)
		{
			LED=_cror_(LED,1);//循坏右移  0111 1111 --> 1011 1111
			delay(50000);
		}
	 }
}
//stm32 两LED轮流闪烁
#include "stm32f4xx.h"
void LED_Init(void)
{	
	GPIO_InitTypeDef GPIO_InitStruct;	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);			
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_9 | GPIO_Pin_10; 
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;             
	GPIO_InitStruct.GPIO_OType= GPIO_OType_PP;             
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;              	
	GPIO_Init(GPIOF, &GPIO_InitStruct);
}

int main(void)
{
	LED_Init();
	while(1)
{
		GPIO_SetBit(GPIOF, GPIO_Pin_9);
		GPIO_ResetBit(GPIOF, GPIO_Pin_10);
		delay(10000000);
		GPIO_SetBit(GPIOF, GPIO_Pin_10);
		GPIO_ResetBit(GPIOF, GPIO_Pin_9);
		delay(10000000);
	}
	return 0;
}
//ARM LINUX下编程 两LED轮流闪烁
#include 
#include 
#include 
#include 
#include 

#define TEST_MAGIC 'x'                                                    
#define LED1 _IO(TEST_MAGIC, 0)              
#define LED2 _IO(TEST_MAGIC, 1)

int main(int argc, char **argv)
{
	int fd;
	fd = open("/dev/Led",O_RDWR);              
	if(fd<0)
	{
		perror("Can not open /dev/LED\n");
		return 0;
	}
	while(1)
	{
		ioctl(fd, LED1, 1);
        ioctl(fd, LED2, 1); 
        sleep(1);               
		ioctl(fd, LED1, 0);                	               
		ioctl(fd, LED2, 0);  
        sleep(1);
	}
	close(fd);
	return 0;
}

 

你可能感兴趣的:(嵌入式)