《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明

1.改写后的程序需要如下源文件:startup.s    retarget_.s    fpinit.c    vfpinit.s   system_.s   main.c

2.另外需要链接器设置文件:6410_scatter.txt(RealView Linker中选择Scattered时设置);

DRAM 0x5020 0000{
  DODE 0x5020 0000
  startup.o(Init,+FIRST)
  *(+RO)
  *(+RW,+ZI)
}
说明:Scatter文件,也叫分散加载描述文件;它指定镜像文件内部各区域的下载和运行时配置。armlink将会根据scatter文件产生一些区域相关的符号,他们是全局的供用户建立运行环境时使用。6410_scatter.txt中指定了代码段的起始地址是0x5020 0000,入口目标文件为startup.o,程序入口段为Init,紧接着该段依次存放RO(代码与只读数据)、RW(读写变量)和ZI(未初始化变量)。

注意:有C的程序和单纯汇编是有区别的;如果单纯汇编代码我们可以在RealView Linker中不选择Scattered而直接在Simple中给出RO地址(也就是代码段地址)编译运行,但C语言需要堆栈、所以在有C语言时必须在它的main函数之前由汇编完成堆栈空间设置等。因此,本程序需要编译汇编部分代码、并且在RealView Linker中设置Scattered。

3.链接配置文件:option.inc(放置src目录即可,不必添加到工程);

汇编语言预定义文件:RealView Assembler.xml(RealView Assembler中Predefines时设置)。

4.下面首先看下更改精简后的,main.c

#define LED1_ON   ~(1<<4)  
#define LED2_ON   ~(1<<5)
#define LED3_ON   ~(1<<6)
#define LED4_ON   ~(1<<7)

#define LED1_OFF   (1<<4) 
#define LED2_OFF   (1<<5)
#define LED3_OFF   (1<<6)
#define LED4_OFF   (1<<7)
#define LEDALL_OFF (0xf<<4) 

typedef unsigned long		u32;

#define rGPIOKCON0 (*(volatile u32 *)0x7f008800)
#define rGPIOKDAT (*(volatile u32 *)0x7f008808)

void delay(int times);

int main(void){	
  u32 uConValue;
  uConValue = rGPIOKCON0;
  uConValue &= ~(0xffff<<16); 
  uConValue |= 0x1111<<16;    
  rGPIOKCON0 = uConValue;
  rGPIOKDAT |= LEDALL_OFF;
  while(1){
    rGPIOKDAT &= LED1_ON;
    delay(1000);
    rGPIOKDAT |= LEDALL_OFF;

    rGPIOKDAT &= LED2_ON;
    delay(1000);
    rGPIOKDAT |= LEDALL_OFF;

    rGPIOKDAT &= LED3_ON;
    delay(1000);
    rGPIOKDAT |= LEDALL_OFF;

    rGPIOKDAT &= LED4_ON;
    delay(1000);
    rGPIOKDAT |= LEDALL_OFF;
  }
}
void delay(int times){
  int i;
  for(;times>0;times--)
    for(i=0;i<3000;i++);
}
====================================================================================================================================

以下是可能遇到问题:

一、基本C问题

编译错误:expected an expression  

原因:

#define rGPIOKCON0 (*(volatile u32 *)0x7f008800);//多了;
#define rGPIOKDAT (*(volatile u32 *)0x7f008808)
二、链接库(汇编部分)编译问题

链接库编译错误:Bad symbol 'VIC_MODE'

原因:

Project菜单下Debug Settings选项卡;Language Settings下的RealView Assembler(即汇编语言设置)下的Predefines->Import Panel,

选如下文件:RealView Assembler.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?codewarrior exportversion="1.0" ideversion="5.5" ?>

<!DOCTYPE EXPORTEDPANEL [
<!ELEMENT EXPORTEDPANEL (NAME, (SETTINGLIST|VALUE))>
<!ELEMENT SETTINGLIST (SETTING+)>
<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT VALUE (#PCDATA)>
]>

<EXPORTEDPANEL>
    <NAME>Panel_for_armasm</NAME>
    <SETTINGLIST>
        <SETTING><NAME>Panel_for_armasm</NAME>
            <SETTING><NAME>Version</NAME><VALUE>261</VALUE></SETTING>
            <SETTING><NAME>Created by</NAME><VALUE>RealView Assembler</VALUE></SETTING>
            <SETTING><NAME>Modified by</NAME><VALUE>RealView Assembler</VALUE></SETTING>
            <SETTING><NAME>Tool name</NAME><VALUE>armasm</VALUE></SETTING>
            <SETTING><NAME>Arguments</NAME><VALUE>--debug --keep --cpu=ARM1176JZF-S --predefine="VIC_MODE SETA 1" --predefine="USE_TCM SETA 1"</VALUE></SETTING>
        </SETTING>
    </SETTINGLIST>
</EXPORTEDPANEL>
三、程序跑飞问题,也是堆栈设置不完整问题

链接库如下不可少:fpinit.o    startup.o    retarget_.o    system_.o    vfpinit.o    main.o

即如下文件:fpinit.c     startup.s    retarget_.s    system_.s    vfpinit.s    main.c

四、程序不执行问题

倘若在RealView Linker中不选择Scattered而直接在Simple中给出RO地址(也就是代码段地址)编译、源文件只有main.c,则也可以编译通过。但在开发板中运行时从RVDS单步调试来看,程序代码一句都没有执行。原因也很简单:就像JAVA语言的运行需要JAVA虚拟机这个前提一样,C的运行不能没有之前对堆栈的设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchFieldException: DEFAULT_TINY_CACHE_SIZE at org.apache.spark.network.util.NettyUtils.getPrivateStaticField(NettyUtils.java:131) at org.apache.spark.network.util.NettyUtils.createPooledByteBufAllocator(NettyUtils.java:118) at org.apache.spark.network.server.TransportServer.init(TransportServer.java:95) at org.apache.spark.network.server.TransportServer.<init>(TransportServer.java:74) at org.apache.spark.network.TransportContext.createServer(TransportContext.java:114) at org.apache.spark.rpc.netty.NettyRpcEnv.startServer(NettyRpcEnv.scala:118) at org.apache.spark.rpc.netty.NettyRpcEnvFactory$$anonfun$4.apply(NettyRpcEnv.scala:454) at org.apache.spark.rpc.netty.NettyRpcEnvFactory$$anonfun$4.apply(NettyRpcEnv.scala:453) at org.apache.spark.util.Utils$$anonfun$startServiceOnPort$1.apply$mcVI$sp(Utils.scala:2237) at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160) at org.apache.spark.util.Utils$.startServiceOnPort(Utils.scala:2229) at org.apache.spark.rpc.netty.NettyRpcEnvFactory.create(NettyRpcEnv.scala:458) at org.apache.spark.rpc.RpcEnv$.create(RpcEnv.scala:56) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:246) at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175) at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:257) at org.apache.spark.SparkContext.<init>(SparkContext.scala:432) at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2509) at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:909) at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:901) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:901) at com.cssl.scala720.KafkaSparkStreamingHBase$.main(KafkaSparkStreamingHBase.scala:28) at com.cssl.scala720.KafkaSparkStreamingHBase.main(KafkaSparkStreamingHBase.scala) Caused by: java.lang.NoSuchFieldException: DEFAULT_TINY_CACHE_SIZE at java.lang.Class.getDeclaredField(Class.java:2070) at org.apache.spark.network.util.NettyUtils.getPrivateStaticField(NettyUtils.java:127) ... 23 more Process finished with exit code 1
最新发布
07-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值