C 进入嵌入式
我正在努力熟悉嵌入式领域,但在购买时间和设备方面资源有限C 进入嵌入式,c,embedded,C,Embedded,我正在努力熟悉嵌入式领域,但在购买时间和设备方面资源有限 在不花费太多时间学习嵌入式特定语言的情况下,什么是一种好的语言?我最熟悉PHP、Java、Actionscript,但不幸的是对C知之甚少。我记得在某个地方读到有人用PERL编程嵌入式系统,但不确定这是否真的可行 不需要购买芯片等就可以通过模拟器或类似设备进行学习吗 有人能推荐一个简化的路线图来说明如何获得SART吗?我有点不确定从哪里开始 你需要知道C(但每个程序员都需要知道C!) 这些平台中的大多数都有一个模拟器/Emulator,
- 在不花费太多时间学习嵌入式特定语言的情况下,什么是一种好的语言?我最熟悉PHP、Java、Actionscript,但不幸的是对C知之甚少。我记得在某个地方读到有人用PERL编程嵌入式系统,但不确定这是否真的可行
- 不需要购买芯片等就可以通过模拟器或类似设备进行学习吗
- 有人能推荐一个简化的路线图来说明如何获得SART吗?我有点不确定从哪里开始
- Vcc电源接通,复位电路确认
信号reset
- 时钟已达到运行速度且电压稳定,因此
被取消断言reset
- 现在,控制器将其指令指针设置为“重置向量”,即该特定芯片上的物理地址
。控制器在该位置获取指令0xe000000
- 中断被禁用,首要的任务是初始化寄存器,如堆栈指针。在某些芯片上,需要清除或设置标志位(例如x86方向标志)
- 一旦寄存器和标志位设置正确,就可以运行中断服务例程。到目前为止,我们必须运行代码到大约位置
,当我们到达代码时,首先通过将一些GPIO引脚切换到外部中断控制器来启用中断,然后启用CPU中断掩码0xE0000072
- 此时,等效的“设备驱动程序”以中断服务例程的形式运行。假设C环境有一个与这些例程的数据结构接口相匹配的库,那么现在我们的引导加载程序代码可以跳转到某些C对象代码的
函数main()
换句话说,将我们从通电状态带到
- 你需要知道C(但每个程序员都需要知道C!)
这些平台中的大多数都有一个模拟器/Emulator,但由于重点是学习真实的应用程序和真实的问题(这些都与真实世界的计时问题有关),因此您需要一个真实的电路板
你可能还想要一个示波器(一个非常便宜的n'th hand慢速模拟示波器就可以了),并且知道如何使用它
最简单的方法可能是,也许更专业,但更难的是,想象一下你的嵌入式控制器坐在一个关闭的电路中
main()
,并处理低级I/O的代码,是在所选芯片特有的汇编程序中编写的。这意味着,如果您想在嵌入式编程方面具有多方面的能力,您必须知道如何从重置向量开始实现汇编代码
事实上,嵌入式编程爱好者没有时间实现所有ISR和引导加载程序代码。出于这个原因,许多人使用可用于特定芯片的标准软件框架。其他人使用自定义语言芯片,如BASICstamp。BASICstamp是一种嵌入式芯片,在板上承载一个BASIC语言解释器。口译员和所有ISR都是为您预先编写的。基本环境使您能够控制I/O引脚、读取电压,以及使用嵌入式控制器组装所能做的一切,但速度稍慢
至于语言,C语言可能是最重要的语言。从Java开始,您应该能够适应,但请记住,许多高级Java将不适用于您。有很多教科书,但我推荐Kernighan和Ritchie的C编程原著 为了更好地介绍嵌入式C,您可以尝试Michael J Pont的一本书: 至于你可以从微芯片开始的嵌入式方面,IDE可以用一个合理的模拟器来开发,c编译器对于稍微有限的学生版c18和c30编译器是免费的,IDE安装程序还会问你是否想安装一个第三方高科技c编译器,你可以使用它。至于处理器,我建议选择标准的18系列PIC,如PIC18F4520 无论芯片制造商是什么,你都必须了解数据表。你不必一次学会所有的东西,但你需要掌握 与大多数编程一样,嵌入式程序往往围绕以下方面展开: 1) 初始化资源,在这种情况下,数据不是来自数据存储,而是来自计算机寄存器。只需包含处理器头文件(.h),它将允许您以端口(通常为字节)或管脚(位)的形式访问这些文件。此外,微处理器在芯片上还附带有用的资源,如定时器、模数转换器(ADC)和串行通信系统(UART)。请记住,芯片本身是一种资源,需要在进行任何其他操作之前进行初始化 2) 使用资源。C将允许您尽可能使数据全球化,并且任何东西都可以随时访问任何东西!避免这种诱惑,并保持它模块化
While(true) // LOOP FOREVER... There is no command prompt
{
// Typically you want I/O to occur on fixed "timebase."
wait(timerTick);
readDigitalIO(&dioStruct);
readAnalogIO(&aioStruct);
// Combine current system state with input values
// and do some useful calculations. (i.e. Analog input to temperature calc)
Process(dioStruct,aioStruct,&CurrentState);
// This can be a serial output/audio buzzer/leds/motor controller
// or Whatever the system REQUIREMENT call for.
driveOutputs(CurrentState);
// The watchdog timer resets your system if it gets stuck.
petWatchDogTimer();
}
// Serial port registers definition:
typedef struct
{
unsigned int control; // Control bits for the port.
unsigned int baudDiv; // Baud rate divider.
unsigned int status; // READ Status bits/ Write resets fifos;
char TXdata; // The head of the hardware TX fifo.
char RXdata; // The tail of the hardware RX filo.
} serRegs;
// Using the volatile keyword to indicate the hardware can change the value
// independantly from the software.
volatile serRegs *Ser1 = (serRegs *)0x8000; // Hardware exists at a specific location in memory.
volatile serRegs *Ser2 = (serRegs *)0x8010; // Hardware exists at a specific location in memory.
// Bits bits 15-12 enable interupts and select interupt vector,
// bits 11-8 enable,bits 7-4 parity,bits 3-0 stop bits.
Ser1->status = 1; // Reset fifos.
Ser1->baudDiv = CLOCKVALUE / 9600; // Set the baudrate 9600;
Ser1->control = 0x1801; // Enable, 8 data, no parity, 1 stop bit.
// Write out a "OK\r\n" message; (Normally this would be a loop.)
Ser1->Txdata = 'O'; // First byte in fifo Transmission starts.
Ser1->Txdata = 'K'; // Second byte in fifo still transmitting first byte
Ser1->Txdata = '\r'; // Third byte in fifo still transmitting first byte
Ser1->Txdata = '\n'; // Fouth byte in fifo still transmitting first byte