中易网

请问谁能帮我详细的解释一下inportw及outportw这两个函数,详细的解释一下,如何使用在c及C++语言中。

答案:4  悬赏:60  
解决时间 2021-01-17 06:53
  • 提问者网友:最美的风景
  • 2021-01-16 18:39
请问谁能帮我详细的解释一下inportw及outportw这两个函数,详细的解释一下,如何使用在c及C++语言中。
最佳答案
  • 二级知识专家网友:爱难随人意
  • 2021-01-16 18:46
以下为两个关键的宏outportw和inportw,实现方法与解释:
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND

EXPORT outportw
outportw strh r0, [r1]
MOV_PC_LR

EXPORT inportw
inportw ldrh r0, [r0]
MOV_PC_LR

首先看c与汇编的接口方式。根据nios的二进制接口规则,当编译器把c函数编译到汇编代码时,如果参数不多于4个,那么就由r0 r1 r2 r3来传递参数,函数的返回值将被放到r0中。比如c中调用这样一个函数outportw(dat,addr),那么当编译器将这个函数编译为汇编时,dat的值被赋给r0,addr的值被赋给r1。在于这个c文件在同一个文件夹下的s文件,如果其中有这么一段:
export outportw
outportw str r0,[r1]
MOV_PC_LR
那么调用在c函数中调用outportw()这个函数的实际作用就是将dat的值发送到addr的地址上去。这样就实现了对底层硬件资源的直接访问。
如果c中有这样一个函数rt = inportw(addr)并且在与这个c文件同一个文件夹下的s文件中有这样一段代码的话:
export inportw
inportw ldr r0,[r0]
MOV_PC_LR
那么这个函数的实际作用就是将addr地址上的值读出并作为函数返回值返回。
上面两段汇编代码中遇到的MOV_PC_LR就是一个MACRO。
MACRO
MOV_PC_LR
[THUMBCODE
bx lr
|
mov pc,lr
]
MEND
其实这种方式实现c与汇编的接口并不是很方便。这样做需要有比较好的汇编基础。其实可以通过相对简单的c宏定义来实现同样的功能。我之前经常使用这样的宏定义来访问固定的地址。#define rDATA (*((volatile unsigned int *)0x********)),这样data = rDATA; rDATA = data;就可以实现对固定内存地址的读写了。其实刚才的汇编代码也是对具体的内存地址进行读写,只是这个地址是作为参数传递的。只要将c函数中的宏定义改成这个样子就可以实现同样的功能。
#define outportw(dat,addr) (*(volatile U16*)(addr) = (dat))
#define inportw(addr) (*(volatile U16 *)(addr))
全部回答
  • 1楼网友:孤独的牧羊人
  • 2021-01-16 20:56
不知道,另请高明。。。。。。。。。。
  • 2楼网友:神的生死簿
  • 2021-01-16 19:47
函数呢?
  • 3楼网友:杯酒困英雄
  • 2021-01-16 19:42
你买本书 看下
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息