zoukankan      html  css  js  c++  java
  • make the OC8051 run

    好吧,我使用了一个洋气的标题,anyway,this's my begin of the oc8051。so,管它中文还是英文,我要开写了。

    作为开头,很多细节我就先略过了,主要简单的介绍几个步骤to make the OC8051 run。

    1、获取OC8051源代码。(opencore或某电子类论坛下载)。

    2、修改oc8051_defines.v。此文件可让用户对硬件进行裁剪和配置。

    修改如下(部分):

     1 //
     2 // oc8051 pherypherals
     3 //
     4 `define OC8051_UART
     5 `define OC8051_TC01
     6 `define OC8051_TC2
     7 `define OC8051_PORTS  //ports global enable
     8 `define OC8051_PORT0
     9 `define OC8051_PORT1
    10 `define OC8051_PORT2
    11 `define OC8051_PORT3
    12 
    13 
    14 //
    15 // oc8051 ITERNAL ROM
    16 //
    17 //`define OC8051_ROM
    18 `ifdef OC8051_ROM
    19     //`define OC8051_XILINX_ROM   //rom implement as xilinx ,or comment to as generic rom. 
    20 `endif
    21 
    22 
    23 //
    24 // oc8051 memory
    25 //
    26 //`define OC8051_CACHE
    27 //`define OC8051_WB
    28 
    29 //-----------
    30 //----ram----
    31 //-----------
    32 //`define OC8051_RAM_XILINX
    33 //`define OC8051_RAM_VIRTUALSILICON
    34 //`define OC8051_RAM_GENERIC
    35 
    36 
    37 
    38 
    39 //
    40 // oc8051 simulation defines
    41 //
    42 `define OC8051_SIMULATION
    43 //`define OC8051_SERIAL
    44 
    45 //
    46 // oc8051 bist
    47 //
    48 //`define OC8051_BIST

    上述设置配置了默认的所有外设,并开启了仿真,而存储的设置则为,rom:无片内rom,使用片外的rom。ram:使用默认的ram模型,由寄存器组(DFF)构成,与具体实现无关,方便仿真。

    3、编写C code。

    主要的C代码如下:

     1 #include <AT89X51.H>
     2 int i;
     3 void umain ()
     4 {
     5 
     6      i=0;    
     7      P0=0x01;
     8      IE=0x82;
     9      IP=0x02;
    10      TMOD=0X01;
    11      TH0=0XFF;
    12      TL0=0XF0;
    13      TCON=TCON | 0x10;
    14      
    15      while(1)
    16      {
    17      }
    18 }
    19 
    20 void Ex0_ISR() interrupt 0 using 1
    21 {
    22 }
    23 void Timer0_ISR() interrupt 1 using 2
    24 {
    25     TH0=0XFF;
    26     if(i<8)
    27     {
    28     i=i+1;
    29     }
    30     else
    31     {
    32     i=0;
    33     }
    34 
    35     P0=0x01<<i;    
    36 }

    上述代码我使用了AT89X51.H头文件,基本上,51是一个很标准的单片机,各种51的变种都有一个相同的子集,因此使用此头文件是没有问题的,你会有疑问,主函数怎么写成

    了umain,是不是笔误,不是的,它就是这样,当然这需要一些其他的操作;在此先略过。

    4、3中生成的hex使用一个小工具,可以生成可作为仿真的.in;.in会被加载到外部rom(我们配置了无内部rom,直接从外部rom启动。)

    运行的波形如下:

    波形和程序相一致,由定时器中断驱动的一个流水灯。

    注:在调试软件的时候发现一个小小的问题,由于使用了全局变量向中断函数传递信息,我第一次的写法是这样的:

    #include <AT89X51.H>
    int i=0;
    void umain ()
    {
        ...

    出现warming:

      *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

        SEGMENT: ?C_INITSEG

    即声明和赋值语句不能同时进行,同时我通过查看map文件和反汇编,发现汇编多出了一条奇怪的跳转指令,不过那个地方的那个奇怪指令正常情况下永远执行不到。

    好吧,我承认,我是一个业余的coder,而且对于51的编程,也是2-3年前的一个课程设计了,边查边写还写出这么烂风格的C代码,可恶的是,写个全局变量还刚好

    就中枪了(ps:嵌入式编程其实很简单,但如何做到优雅而高效则不简单)。

  • 相关阅读:
    oracle 的exists 的用法
    linux
    C++纯虚函数
    C++ 的虚析构函数
    C++ new
    C++点和箭头操作符用法区别
    static
    关于C的int
    互斥量mutex的简单使用
    nginx服务器屏蔽上游错误码
  • 原文地址:https://www.cnblogs.com/lkiller/p/3683907.html
Copyright © 2011-2022 走看看