Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 进入嵌入式_C_Embedded - Fatal编程技术网

C 进入嵌入式

C 进入嵌入式,c,embedded,C,Embedded,我正在努力熟悉嵌入式领域,但在购买时间和设备方面资源有限 在不花费太多时间学习嵌入式特定语言的情况下,什么是一种好的语言?我最熟悉PHP、Java、Actionscript,但不幸的是对C知之甚少。我记得在某个地方读到有人用PERL编程嵌入式系统,但不确定这是否真的可行 不需要购买芯片等就可以通过模拟器或类似设备进行学习吗 有人能推荐一个简化的路线图来说明如何获得SART吗?我有点不确定从哪里开始 你需要知道C(但每个程序员都需要知道C!) 这些平台中的大多数都有一个模拟器/Emulator,

我正在努力熟悉嵌入式领域,但在购买时间和设备方面资源有限

  • 在不花费太多时间学习嵌入式特定语言的情况下,什么是一种好的语言?我最熟悉PHP、Java、Actionscript,但不幸的是对C知之甚少。我记得在某个地方读到有人用PERL编程嵌入式系统,但不确定这是否真的可行

  • 不需要购买芯片等就可以通过模拟器或类似设备进行学习吗

  • 有人能推荐一个简化的路线图来说明如何获得SART吗?我有点不确定从哪里开始

    • 你需要知道C(但每个程序员都需要知道C!)

      这些平台中的大多数都有一个模拟器/Emulator,但由于重点是学习真实的应用程序和真实的问题(这些都与真实世界的计时问题有关),因此您需要一个真实的电路板

      你可能还想要一个示波器(一个非常便宜的n'th hand慢速模拟示波器就可以了),并且知道如何使用它


      最简单的方法可能是,也许更专业,但更难的是,想象一下你的嵌入式控制器坐在一个关闭的电路中

    • Vcc电源接通,复位电路确认
      reset
      信号

    • 时钟已达到运行速度且电压稳定,因此
      reset
      被取消断言

    • 现在,控制器将其指令指针设置为“重置向量”,即该特定芯片上的物理地址
      0xe000000
      。控制器在该位置获取指令

    • 中断被禁用,首要的任务是初始化寄存器,如堆栈指针。在某些芯片上,需要清除或设置标志位(例如x86方向标志)

    • 一旦寄存器和标志位设置正确,就可以运行中断服务例程。到目前为止,我们必须运行代码到大约位置
      0xE0000072
      ,当我们到达代码时,首先通过将一些GPIO引脚切换到外部中断控制器来启用中断,然后启用CPU中断掩码

    • 此时,等效的“设备驱动程序”以中断服务例程的形式运行。假设C环境有一个与这些例程的数据结构接口相匹配的库,那么现在我们的引导加载程序代码可以跳转到某些C对象代码的
      main()
      函数

    • 换句话说,将我们从通电状态带到
      main()
      ,并处理低级I/O的代码,是在所选芯片特有的汇编程序中编写的。这意味着,如果您想在嵌入式编程方面具有多方面的能力,您必须知道如何从重置向量开始实现汇编代码

      事实上,嵌入式编程爱好者没有时间实现所有ISR和引导加载程序代码。出于这个原因,许多人使用可用于特定芯片的标准软件框架。其他人使用自定义语言芯片,如BASICstamp。BASICstamp是一种嵌入式芯片,在板上承载一个BASIC语言解释器。口译员和所有ISR都是为您预先编写的。基本环境使您能够控制I/O引脚、读取电压,以及使用嵌入式控制器组装所能做的一切,但速度稍慢

    • 嵌入式计算的范围已经变得非常广泛,因此答案在某种程度上取决于您的目标设备。一方面,有8位控制器,只有几KB的内存,通常完全用汇编或C语言编程。另一方面,路由器中的处理器功能相当强大(200 MHz和几MB RAM并不少见),通常运行Linux之类的操作系统,这意味着你可以使用几乎任何语言,虽然C和Java是最常见的

    • 最好是买一个真正的芯片和实验。所涉及的大部分工作通常是了解一个设备以及如何与之接口,因此使用模拟器有点达不到目的


    • 至于语言,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