6678的使用记录

使用EMFI模拟32位操作

背景

在一个项目中,需要将程序移植到6678上。由于6678的EMIF只是原生支持8位、16位的操作,但我们又需要使用32位的读写操作,于是,想到利用两次16位读写来模拟32位的读写。

出现的问题

按上面这样做,刚开始挺顺利,但后来发现EMIF读写有时会异常,且多核运行时现象尤其明显。排查后发现,原因是,在模拟32位读写操作时,是发起了两次EMIF读写操作,这个模拟操作并不是原子的,很可能在执行完其中一次EMIF操作后,插入了其他指令(各个核、主循环、中断公用一个EMIF总线),导致EMIF交互出现问题。

解决方式

  • 考虑过使用信号量锁定的方式,但由于EMIF操作在程序中使用的过多,中断、主程序、各个核都在使用EMIF,它们之间的优先级并不是那么能明确定义的,使用信号量后出现了死锁
  • 考虑过对FPGA代码进行修改,与EMIF交互时,通过高位地址来区分该次EMIF操作对应的主程序、中断、各个核号信息,这样做有些麻烦,问题应该是能解决的
  • 采用的方式是,采用32位指针的方式发起EMIF操作

Clock_create函数中的timeout

使用定时中断时,发现在进入中断之前,初始等待时间有些长,后来发现,是Clock_create函数中的timeout理解有误。如下图,在第一次timeout之后,函数才按照设定的周期执行。另外,注意,可以修改cfg文件的配置参数,来设定定时器的tick值
在这里插入图片描述

参考博文

SYS/BIOS–CLOCK
SYSBIOS系统中的定时模块

网络初始化异常

原因有很多,我出现这个问题的原因是,load程序之前,没有进行system reset。

Sections

名称用途
.cinit存放C程序中的变量初值和常量
.switch存放C程序中switch语句的跳针表
.const存放C程序中的字符常量、浮点常量和用const声明的常量
.text存放C程序的代码
.bss为C程序中的全局和静态变量保留存储空间
.far为C程序中用far声明的全局和静态变量保留空间
.stack为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果
.sysmem用于C程序中malloc、calloc和realloc函数动态分配存储空间

在这里插入图片描述

CMD文件那些事(上)
CMD 文件那些事(下)

CCS读取文件

在CCS中使用fcanf函数读取文件内容,文件格式如下,

10 20
30 40
50 60

当使用如下的代码一次读取两个数时,则dataA的值读成了第二列的值,dataB的值读成了0,

Int16 dataA,dataB;
...
fscanf(fp,"%d %d\n",&dataA,&dataB);

当使用如下的代码一次读取一个数时,则每次读取的数据正常,

Int16 dataA;
...
fscanf(fp,"%d",&dataA);

最后发现应该是由于fcanf函数默认待读取的数据是Int32的格式,而上述代码中将dataA、dataB声明成了Int16;如果需要读取Int16数据,则需要使用“%hd”指定数据类型,这样就正常了。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值