使用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函数动态分配存储空间 |
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”指定数据类型,这样就正常了。