Keil C51编译及连接技术

发布者:RainbowDreamer最新更新时间:2016-12-15 来源: eefocus关键字:Keil  C51  编译  连接技术 手机看文章 扫描二维码
随时随地手机看文章

  主要介绍Keil C51的预处理方法如宏定义、常用的预处理指令及文件包含指令,C51编译库的选择及代码优化原理,C51与汇编混合编程的方法与实现以及超过64KB空间的地址分页方法的C51实现。

教学目标

  1.了解Keil C51的预处理方法,主要有宏定义#define、常用的预处理指令#define、#error、#if 、#else、#elif、#endif、#ifdef、#ifndef 、#undef 、#line 、#pragma 及文件包含指令#include。

  2.了解small、compact、large三种编译模式信代码优化方法。

  3. 掌握C51模块内部调用汇编程序的三种方法,理解C51模块与汇编模块之间的接口规则,主要有C51函数名与汇编程序名的转换规则、C51函数及其相关段的命名规则、C51函数的参数传递规则。

  4.理解Keil C51的Bankswitch原理,了解Keil C51的三种分页方式、公共空间的概念,掌握BL51有关分页的配置,以PSD813F2为硬件基础,掌握Keil C51分页的实现过程,能进行分页的程序设计。 

 

  一、预处理器

  1.1宏定义

宏定义格式如下:#define 名称 替换文字

宏是一种简单的替换,在程序中凡是出现“名称”之处均被“替换文字”替代,替换文字可以是数字,也可以是字符串。

  1.2预处理指令

由ANSI C的标准规定, 预处理指令主要包括: #define、#error、#if 、#else、#elif、#endif、#ifdef、#ifndef 、#undef 、#line 、#pragma。

  #define 指令
  例如:#define PI 3.1415926 凡是出现“PI”的地方均以“3.1415926”替换。宏的出现有助于提高程序的可读性及书写方便性,也有助于程序的调试。但是,出现在引号中的字符串是不能替换的。如printf(“PI\n”);该语句运行后输出的是:PI而不是3.1415926。

  define注意事项:
1)在宏定义语名后没有“;”;
2)在C51程序中习惯上用大写字符作为宏替换名,常放在程序开头; 
3)宏定义还有一个特点,就是宏替换名可以带有形式参数,在程序中用到时,实际参数会代替这些形式参数。 
例如: #define MAX(x, y) (x>y)?x:y

复制代码

main() 
{ 
    int i=10, j=15; 
    printf("The Maxmum is %d", MAX(i, j);
}

复制代码

上例宏定义语句的含义是用宏替换名MAX(x, y)代替x, y中较大者,同样也可定义: 
#define MIN(x, y) (x表示用宏替换名MIN(x, y)代替x, y中较小者。
4)#define命令在程序之外,其有效范围为定义命令之后到源文件结束,但是可以用#undef命令终止宏定义的作用域。如:

复制代码

#define PI 3.1415926void main(void)
{
    ……
}#undef PI

复制代码

PI的范围从#define 开始到#undef PI 结束。

  #if、#else、#endif指令
#if、#els和#endif指令为条件编择指令, 它的一般形式为:

复制代码

#if 常数表达式 
    语句段; 
#else 
    语句段; 
#endif

复制代码

上述结构的含义是: 若#if指令后的常数表达式为真, 则编译#if到#else 之间的程序段; 否则编译#else到#endif之间的程序段。 
例如:

复制代码

#define MAX 200 main() 
{ 
    #if MAX>999 
        printf("compiled for bigger\n"); 
    #else 
        printf("compiled for small\n"); 
    #endif }

复制代码

  #undef指令
#undef指令用来删除事先定义的宏定义, 其一般形式为: 
#undef 宏替换名 
例如:

#define TRUE 1 ... 
#undef TURE

#undef主要用来使宏替换名只限定在需要使用它们的程序段中。

  #include
文件包含是指用#include通常用来将一些常用的宏定义或变量定义所在的源文件包含到“#include”所在的文件中来。 
通常格式如下: 
#include“filename” 或 #include 
在编译预处理时,将#include命令进行文件包含处理,即将filename中的全部内容复制插入到该指令处,减少重复劳动。通常引号包含的文件与现文件在同一个位置,否则用“<>”括起来。 
在源文件开始处一般都要用一些#include指令,如

#include “stdio.h” 
#include “reg51.h”

如用户自定义了一个字库文件”kzk.h”,在源文件开始用#include “hzk.h”,之后,则可以在源程序中使用字库。

 

  二、C51编译库及代码优化技术

  2.1 C51编译库
  C51编译器包含6个不同的编译库,如表12-2-1可根据不同需要进行优化 , C51 编译器包含的库模块,都有源代码,对它们可作与硬件相关的修改。用户改变对于现有硬件输入和输出结构的两个模块,就可修改所有库函数,同样也可以重新很快地构造如“printf”和“puts”函数系统默认串口为输出设备,但用户可修改为LCD 显示。

 

  2.2 代码优化
C51可将即使有经验的程序员编制的代码进行优化,用户可选6个优化级,C51的所有优化方法如下: 
  1)一般优化:
常数折迭:发生在一个表达式或地址计算中的几个常数值组合为一个常数;
跳转优化:跳转转到最终的目标地址,以提高程序效率;
死码消除:不可执行代码(死码)可从程序中去掉;
寄存器变量:只要有可能,自动变量和参量放入寄存器中;
通过寄存器传递参数:寄存器中可传递最多三个参数;
全局公共子式消除:相同的子表达式或地址计算(多次发生在同一函数中)将被识别出来,并且只要有可能,将只计算一次。
  2)基于8051 的优化
窥孔(PEEPHOLE)优化:只要能节省存贮空间或执行时间,复杂的运算都将化简。
访问优化:常数和变量直接包含在操作中。
数据覆盖:函数的数据和位移被标记为OVERLAYABLE,被L51 用其它数据和位覆盖。
CASE/SWITCH 优化:SWITCH/CASE 语句优化为一个跳转或一串跳转。
  3)代码生成选项:
OPTMIZE(SIZE):共同的“C”操作被子程序代替:程序码长被压缩。
NOAREGS:不使用绝对寄存器访问,程序代码在这种方式下独立于寄存器组。
NOREGPARMS:参数传递总是在本数据段完成,程序代码与早期C51 版本兼容。

  三、C51与ASM混合编程技术
  3.1 混合编程意义
通常用C51来编写主程序。然而,在一些时序要求严格的采用汇编程序设计具有更高的效率,因此要求在C程序中调用一些用汇编语言编写的子程序。
另一方面,在以汇编语言为主体的程序开发过程中,如果涉及到复杂的数学运算,往往需要借助C51提供的运算库函数和强大的数据处理能力,这就要求在汇编中调用C51函数。
  3.2 C51模块内的汇编接口
模块内接口通常是指在C函数内部插入汇编代码,也称内嵌汇编语句 。
在线汇编提供了能直接读写硬件的能力,如读写中断控制允许寄存器等,但编译器并不检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。 
  方法一、直接在函数体内的每个汇编语句前加?“asm”预编译指令。

复制代码

void reset_data(void)
{
    asm    MOV R1,#0AH
    asm    LOOP: INC A
    asm    DJNZ R0,LOOP    return;
}

复制代码

  方法二、把asm作为关键字后续汇编用大括号括起来即可。

复制代码

void reset_data(void)
{
    asm
    {
        MOV R1,#0AH
        LOOP: INC A
        DJNZ R0,LOOP
    }    return;
}

复制代码

  方法三、在C模块内通过语句“#pragma”嵌入汇编代码。

复制代码

void reset (void)
{    #pragma asm
        MOV R1,#0AH
        LOOP: INC A
        DJNZ R0,LOOP    #pragma endasm    return;
}

复制代码

  Keil C51编译环境相关设置 
  将嵌有汇编语句源文件加入要编译的项目文件,将光标指向此文件,选择右键菜单“option?for?file?'asm.c'”,将属性单“properties”中的“Generate?Assembler?SRC?File”与“Assemble?SRC?File”两项设置成黑体的“√”,将“Link?Public?Only”的“√”去掉,再编译即可。用此方法可以在C51源代码的任意位置用#pragma?asm和#pragma?endasm嵌入汇编语句。如果编译时未用SRC指令,则C51中的汇编代码会被编译器忽略。

 

3.3 C51与汇编的模块间接口
1、C51函数名与汇编程序名的转换规则 
C51程序模块编译成目标文件后,其中的函数名依据其定义的性质不同会转换为不同的函数名,因此在C51和汇编程序的相互调用时要求汇编程序必须服从这种函数名的转换规则。C51中函数名转换规则如表12-3-1所列。


2、C51函数及其相关段的命名规则
一个C51源程序模块被编译后,其中的每一个函数以“?PR?函数名?模块名”为名的命名规则被分配到一个独立的CODE段。 
如:模块“FUNC51”内包含一个名为“func”的函数,则其CODE段的名字是“?PR?FUNC?FUNC51”。 
如果一个函数包含有data和bit对象的局部变量,编译器将按“?函数名?BYTE和?函数名?BIT”命令规则建立一个data和bit段,它们代表所要传递参数的起始位置,其偏移值为零。这些段是公开的,因而它们的地址可被其它模块访问。另外,这些段被编译器赋予“OVERLAYABLE”标志,故可被L51连接/定位器作覆盖分析。
依赖于所使用的存储器模式,这些段的段名按表12-3-2所列规则命名,在相互调用时,汇编语言必须服从C51有关段名的命名规则。 
各种存储器模式下函数相关段名的命名规则


3、C51函数的参数传递规则
C51函数和汇编接口的关键在于C51函数的参数传递规则。 
Keil C51具有特定的参数传递规则。 
Keil C51函数最多可通过CPU寄存器传递三个参数,表12-2-3是利用寄存器传递参数的规则。 
如果参数较多而使得寄存器不够用时,部分参数将在固定的存储区域内传送,这种混合的情况有时会令程序员在弄清每一个参数的传递方式时发生困难。 
如果在源程序中选择了编译控制命令“#pragma NOREGPARMS”,则所有参数传递都发生在固定的存储区域,所使用的地址空间依赖于所选择的存储器模式。这种参数传递技术的优点是传递途径非常清晰,缺点是代码效率不高,速度较慢。
当函数具有返回值时,也需传递参数,这种返回值参数的传递均是通过CPU内部寄存器完成,其传递规则如表12-3-4所示。

参数传递规则
参数传递规则的例子

func1(int a):“a”在R6/R7中传递;                                                                                                                                        
func2(int a,int b,int *c):“a”和“b”在R6/R7和R4/R5中传递,“c”在R1/R2/R3中传递 ;                                                                                    
func3(long a,long b):“a”在R4/R5/R6/R7中传递,“b”在参数段中传递 ;

SRC是一个十分有用的编译控制命令,它可令C51编译器将一个C源文件编译成一个相应的汇编源文件,而不是目标文件,在这个汇编文件中,我们可清楚地看到每一个参数的传递方法。
示例剖析

复制代码

#include#define uchar unsigned charuchar func(uchar x,uchar y);    /*函数func 原型声明*/void main(void)                    /* 主函数 */ {
    func(7,3);                    /* 调用函数func */ } 
uchar func(uchar x,uchar y)        /* 函数func */ { 
    return (x/y);                /* 计算x/y并返回结果 */ }

复制代码

汇编结果

复制代码

    RSEG  ?PR?_func?C12_2_1A  ; 寄存器传递参数                             _func:    ; 函数func代码段起始                                          
    USING    0 ;使用第0组寄存器                                             
            ; SOURCE LINE # 8                                              ;---- Variable 'y?141' assigned to Register 'R5' ---- ;输入参数y由R5传递;---- Variable 'x?140' assigned to Register 'R7' ----;输入参数x由R7传递 ; {                                                                     
            ; SOURCE LINE # 9                                              ; return (x/y);     /* 计算x/y并返回结果 */                             
            ; SOURCE LINE # 10                                             
    MOV      A,R7                                                           
    MOV      B,R5                                                           
    DIV      AB                                                             
    MOV      R7,A                     ; 返回数据由R7传递                    ; }                                                                     
            ; SOURCE LINE # 11                                             ?C0002:                                                                 
    RET                                                                                                                                                                ; END OF _func                                                          END

复制代码

函数名func前有一个前缀字符“_”,这表明该函数采用寄存器传递参数,寄存器R7和R5用来传递参数,计算结果经R7返回。

3.4 应用实例 
AD7705的写操作子程序,并给出C51调用格式。

 

复制代码

NAME   AD7705
    PUBLIC  _WRITE
   ?PR?WRITE?AD7705 SEGMENT CODE
   RSEG ?PR?WRITE?AD7705_WRITE:MOV A,R7    ;;;指令由R7传入
      MOV R1,#08HLOOP01:CLR P1.4    ;;;SCLK_0
      NOP
      RLC A      MOV  P1.5,C  ;;;Din
      NOP
      SETB P1.4  ;;;SCLK_1
      NOP
      NOP
      DJNZ R1,LOOP01      RET

复制代码

在调用WRITE函数之前先声明该函数为为extern函数,格式如下:extern void WRITE(unisigned char);
C51调用该子程序的格式为 void WRITE(unsigned char command)

四、Keil C51环境下的分页技术 
4.1 Keil C51的Bankswitch原理
Keil的BL51使用页面寻址的方式来增加代码空间。EPROM被分页,每页的大小以及在页间进行跳转的方式取决于具体的应用,可以由用户自行设置。 
1、Keil C51的分页方式 
Keil C51支持的分页方式有三种:
1)利用单片机I/O口线。通常默认是P1口,采用1条P1口线时, 分组数为2,采用5条P1口线时,最多可分为32个代码组,剩余的P1口线也可用于其他用途。
2)利用片外数据存储器(XDATA)空间实现分页。指定一个XDATA端口字节实现分页操作,该字节中的剩余位,不能再用于其他目的。
3)用户自定义方式实现分页。
根据PSD系列器件的特性,本文介绍的是其中的第二种。采用的分页方式、页数和地址在L51_BANK.A51中进行配置。 
2、公共空间 
公共空间:分页的所有页面均要留有一个相同的存储区域,这个区域包括中断向量、中断功能函数、调用其它EPROM页面的函数、C51库函数、在页面间跳转的代码和被多个页面代码使用的常量及变量.
通常在每页面的底部留作公共空间,保存公共代码。公共空间是处理器在任何时候都能够寻址的。
公共空间是占总存储空间的,若每个页面总存储容量为64KB,公共空间需要10KB存储空间,则该页面给用户实际使用的空间为54KB。若用户使用的页面数为8页,则用户最大使用的代码空间为8×(64-10)+10=442KB。通常页切换需要大约50个机器周期和2字节的堆栈空间。
3、BL51的配置
需要对L51_BANK.A51文件预先进行相关参数的设置,该文件是BL51连接定位器的一部分。 
主要有以下几项配置内容:
1)?B_NBANKS EQU X 。定义最大页数,BL51 最大可定义为32页,X值可取为2、4、8、16和32。 
2)?B_MODE EQU Y。设置KeilC51的分页方式。Y取值为0、1、4。含义如下:0—通过8051单片机的I/O口进行分组切换;1—通过XDATA存储器单元进行分组切换;4—用户自定义切换方式。 
3)?B_RTX EQU Z。设置系统是否使用RTX-51 FULL实时操作系统。Z取值为0、1,分别代表不使用RTX-51及使用RTX-51实时系统。
其它如?B_VAR_BANKING的设置通常使用系统的默认值。 
4.2 基于PSD813F2的分页硬件设计 
PSD813F2内置128KB闪存,分8个页面,每页16KB,内置可选的32KB启动存储器、2KB的SRAM、27个I/O端口、电源管理单元、40个可编程逻辑宏单元CPLD,通过JTAG串行接口允许在系统编程整个器件。适用于8031、MC68HC11、Dallas、Z80等20余种单片机。


4.3分页的实现过程及实例 
1 PSD Soft配置 
1)在Page Register Definition步骤中选择pgr0,只分两页,如图12-4-2所示。在Chip Select Equation n步骤中设置rs0为0页,地址0000H~07ffH;csiop地址4000H~40ffH;fs0、fs1、fs2、fs3设置为0页,地址分别为0000H~3fffH(如图12-4-3所示)、4000H~7fffH、8000H~bfffH、c000H~ffffH,fs4、fs5、fs6、fs7设置为1页。

 

二、Keil C51项目设置 
1)建一个KeilC51的新项目,命名为如KC_PSD,在菜单Project选择中选择Option for Target “Target 1”选择项,按图12-4-4所示进行分页及地址配置。


●由于PSD813F2片内从FLASH为32KB。故在off-chip code memory-Eprom设为0x0000~0x7fff。如果这32KB用户未使用,也可空着不填。 
● 在PSD813F2的PSDSoft Express已配置2KB的SRAM,地址范围为0x0000~0x07ff,故在off-chip Xdata memory-Ram设为0x0000,长度为0x0800。
● 在PSD813F2的PSDSoft Express已配置256个字节的CSIOP空间,地址范围为0x1000~0x10ff, 故在off-chip Xdata memory-Ram设为0x4000,长度为0x0100。 
● 在PSD813F2的主FLASH为128KB,共分为8个物理页,此处在逻辑上分为两页,每页64KB。因此在KeilC51中如图12-4-2所示分为2个Banks,地址范围为0x0000~0xffff
2)L51_Bank.A51的修改
在KeilC51的安装目录\KeilC51\C51\EXAMPLES\Bank_EX1中,把L51_Bank.A51文件的拷贝并加入到KC_PSD 项目并作如下修改:

A?B_NBANKS EQU 2 //定义最大页数(0~32),可为2、4、8、16和32。 
?B_MODE EQU 1 //0:通过8051单片机的I/O口进行分组切换,1:通过XDATA存储器单元进行分组切换,4:用户自定义切换方式。 
?B_XDATAPORT EQU 40E0H //如果?B_MODE被定义为1,就通过XDATA口定义XDATA口引脚地址/位来映射开关定义XDATA口地址40E0H。

 

3)新建主程序和各bank文件。 
示例
示例的项目主要是为演示BankSwitch,演示结果为单片机的P1.0引脚的发光二极管闪烁。
由主文件psd1.c调用psd2.c中的延时子程序Delay(),psd1.c 存放在第一页(64KB存储空间)中,psd2.c存放在第二页(64KB存储空间)中。
主程序psd1.c 源程序

复制代码

#includeextern void Delay(unsigned char d1);
sbit P1_0=P1^0;void main(void)
{ 
    Delay(10);    while(1)
    { 
        P1_0=!P1_0;
        Delay(100);
    }
}

复制代码

psd2.c 源程序

复制代码

void Delay(unsigned char d2)         
{                                  
    unsigned char i,j,k;             
    for(k=0;k

复制代码

4)设置文件的属性。对于主文件psd1.c,选择Options for File,设置Code Bank为“bank#0”,设置Stop on Exit为“Not Specified”如图12-4-5所示。类似地,Psd2.c设置为Bank #1。L51_Bank.A51设置为“default”。 
5)设置好后,进行编译,生成HEX文件KC_PSD.h00及KC_PSD.h01。 

3 编程 
● 打开PSDSoft Express软件,在Merge MCU Firmware with PSD模块中设置各个FLASH页面的地址和文件名,如图12-4-6所示。


主FLASH第0页(FS0),地址:0x0000-0x3fff,文件名:KC_PSD.hoo
主FLASH第1页(FS4),地址:0x0000-0x3fff,文件名:KC_PSD.ho1 
MCS-51单片机的寻址空间突破64KB需要硬件的支持和软件保障。 
利用PSD813F2芯片与MCS-51单片机的无缝连接,Keil C51的Bankswitch技术有效地实现了MCS-51单片机程序代码64KB空间的突破,解决了大容量存储器的系统如POS机、打印机或大量汉字显示系统等系统软件设计时的换页难题,降低了单片机软件设计人员的程序设计难度。


关键字:Keil  C51  编译  连接技术 引用地址:Keil C51编译及连接技术

上一篇:Keil C51处理可重入函数问题的探讨
下一篇:C51函数的递归调用

推荐阅读最新更新时间:2024-03-16 15:25

keil编写的 C51错误 *** WARNING L1
用keil编写的 C51错误 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_START 解决办法: 1.是文件没有添加到工程里。 2.可能是因为存在没有被调用的已经定义的函数。 3.不知道你有没有把Source group组下面的A51.C删掉,如果没有删,在A51.c上点右键,选择remove file . 4.建一个新的c文件,里面写一个空的函数,把该文件添加到project中,注意该文件不能再选generate assembler SRC file和assemble SRC file选项。重新编译工程,如果警告该函数没被调用,在主文件中调一下。 5.建一个新的
[单片机]
C51单片机与PC串口通信的单片机部分程序
注意波特率是9600 功能:电脑通过串口给单片机发一个字节,单片机收到后又给电脑发回去 #include reg52.h #define uchar unsigned char #define uint unsigned int uint temp; bit flag; void init_ser1(); main() { init_ser1(); while(1) { if(RI==1) { P1=SBUF; RI=0; } if(flag==1) { ES=0;//暂时关闭接收 flag=0; SBUF=temp; while(!TI);//等待发送完毕 TI=0; ES=
[单片机]
keil5+STM32F10x 使用ST-Link烧写程序;使用FlyMcu烧写程序
ST-Link 这个是J-Link调试,应该差不多: https://www.cnblogs.com/sovagxa/p/8997388.html 淘宝店家给的调试器是ST-Link的: 运行后,首先先连接: 之后打开要下载的.hex文件,图中对应按钮打开文件: 设置settings,选择SWD: 之后点击编程并校验: FlyMcu usb连接时,要注意usb1是可以下载程序的,usb2不行 选择对应的端口,选项是校验与编程后执行,RTS的高电平复位DTR低电平进BootLoader 之后选择一个.hex文件,点击开始编程:
[单片机]
<font color='red'>keil</font>5+STM32F10x 使用ST-Link烧写程序;使用FlyMcu烧写程序
arm-linux,arm-elf-交叉编译环境下载地址
最常用的编译版本是arm-linux-gcc-3.4.1 和 arm-linux-3.3.2 的,现在的嵌入式开发基本上用的是这些,3.4.1的用于编译2.6的内核,而3.3.2的常用于编译busybox,和bootloader(u- boot),编译的版本配合不好的话就会出错,所以要选择好编译版本,如果这个版本不行的话,可以试试其他的版本,在uclinux上用的多的就是 arm-elf-tools-20030314 http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2 http://www.handhelds.org/do
[单片机]
华为方舟编译器开源官网正式上线:源代码已经开放了下载
华为方舟编译器开源官网已经在今天正式上线(https://www.openarkcompiler.cn),目前源代码已经提供下载。 官网介绍,方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台,包含编译器、工具链、运行时等关键部件。 目前,方舟编译器还在持续演进中,陆续将上述能力实现和开源。 据悉,本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch64汇编指令的编译过程。 开发者可以获得相关代码和文档,供参考学习、了解方舟编译器的架构和代码。 华为表示,在开源的世界里,我们与开发者们分享技术进步,共同成长,
[手机便携]
华为方舟<font color='red'>编译</font>器开源官网正式上线:源代码已经开放了下载
C51:数模模数转换
前言 三种ADC的原理就默认都懂了~ 数模模数转换:DAC DA硬件上讲比较容易,就是通过运算放大器把二进制数(一系列的稳定的高低电平)转换成不稳定的、连续变换的波。 比如下面这个图,可以得到 的通式就是 公式怎么来的? 图中的MOS都是绝缘栅型、N沟道、增强型管,在 时有可以导通。所以在每个管子的 处,如果给1,即高电平,那么该管子导通,看做漏级与栅极之间短路。 上面这个公式就表明了简单的DA转换原理。 不是一个位对应一个电压值,而是一个二进制数对应一个电压值。 另外,上面式子中前面的系数 是其比例系数、单位电压,也是最小输出电压的增量。 数模转换器结构 一个二进制对应一个电压值,可是电
[单片机]
<font color='red'>C51</font>:数模模数转换
Keil MDK3.20的stm32调试方法
1. 程序在RAM中运行 要点: (1)程序的下载地址改到RAM空间中 (2)程序的debug之前要设定SP,PC指针到Ram空间 新建工程,选择STM32 的具体型号,我买的万利的开发板,选择stm32f103Vb。 设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。 空间大小如何分配取决于自己的需求。本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。 Debug标签选择ULINK1 Cortex Debugger(软件采用yjgyiysbCC兄crack方
[单片机]
<font color='red'>Keil</font> MDK3.20的stm32调试方法
tiny4412 解决内核编译版本号问题
内核版本: linux-3.5 开发板: tiny4412 作者:彭东林 邮箱:pengdonglin137@163.com 问题: 由于我使用 git 管理内核代码,导致编译完成后内核版本变成了如下形式: Linux version 3.5.0-FriendlyARM-g5291689 自带的 ko 文件只认识 Linux version 3.5.0-FriendlyARM,所以导致 ko 加载失败。 解决办法一 重新把驱动模块编译一遍 解决办法二 Make menuconfig --- General setup --- Automatically append version information to
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved