问题描述
我正在尝试使用内联汇编编写一个简单的函数并在 C 程序中使用它mem_io_read
是一个函数,它绕过缓存读取内存地址(尽管地址位于可缓存的内存区域中)。适用于 aarch64 机器。
static inline int mem_io_read(unsigned long paddr)
{
unsigned long val;
register pa;
__asm__ __volatile__("mov %0,%1\n\t" : "=r" (pa) : "r"(paddr)); <-- move paddr to a register pa
__asm__ __volatile__("ldnp %0,[%1]\n\t" : "=r" (val) : "r" (pa)); <-- load data from addr in pa
return val;
}
main()
{
...
uint32_t SCP_WR_ADDR = &scp_wait; // where test1val was located. //x06000000;
uint32_t chk_scp_rd_data = 0;
// Send flag for proceeding SCP test
(*(volatile uint32_t *)(SCP_WR_ADDR)) = 0x87654321; <-- send signal to the other processor (scp)
// Receives flag from SCP
while(chk_scp_rd_data != 0x12345678) <--- read back until the value is changed (reverse order)
{
chk_scp_rd_data = mem_io_read(SCP_WR_ADDR);
}
}
当我使用 gcc 编译它时,出现此错误
/tmp/ccCpQGc5.s: Assembler messages:
/tmp/ccCpQGc5.s:26: Error: operand 2 must be an integer register -- `ldnp x0,[x0]'
我无法弄清楚这里出了什么问题。请帮忙。
ADD :根据 Peter Cordes 的评论,我将其更改为这个。编译正常。
static int inline mem_io_read(unsigned long paddr)
{
int val,val1;
__asm__ __volatile__("ldnp %0,%1,[%2]\n\t" : "=r" (val),"=r" (val1) : "r" (paddr) : "memory");
return val;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)