所有关于电路

汇编语言到c

j

螺纹启动器

JEY11

加入2010年6月7日
25.
我需要开始计时器,这个装配代码正常工作,但需要转换为C.任何援助非常感谢,

// #define t_base 0xff202000
// volatile int * t_ptr =(int *)t_base;
@获取地址
LDR R4,= 0xFF202000


以下需要援助....

@启动持续计时器
@ counting(0b0110)
Mov r1, #6
STR r1, [r4, #4]
Papabravo

Papabravo

加入2006年2月24日
15,638
我需要开始计时器,这个装配代码正常工作,但需要转换为C.任何援助非常感谢,

// #define t_base 0xff202000
// volatile int * t_ptr =(int *)t_base;
@获取地址
LDR R4,= 0xFF202000


以下需要援助....

@启动持续计时器
@ counting(0b0110)
Mov r1, #6
STR r1, [r4, #4]
如果有一种简单的方法来完成你想要的东西,这将是很好的,但事实是这样做需要一些你正在进行的环境和编译器的环境知识。也是答案不是唯一的情况。我们在谈论什么样的汇编者,我们在谈论哪个C编译器?

在上面的第一个例子中,你已经给了自己想要的东西。我不知道你觉得你错过了什么。您已经取了一个十六进制常量(我认为它代表某个处理器内存空间中的绝对地址),对该常量进行了强制转换,创建了一个指向整型数的指针,并将其赋值给一个名为T_ptr的变量。您还指出T_ptr是易失性的,这意味着编译器不能依赖于能够读回它刚刚写入到T-ptr的内容。

我猜这两个汇编语言指令是什么意思,但如果我们可以依靠T-ptr分配给它的值,也就是说,一个指针地址0 xff202000,你要做的是写什么地址+ 4价值“6”,然后下面的“可以理解”,你的编译器:

C:
*(t_ptr + 4)= 6;
应该这样做。这不是肯定的,不是某些,但可能是。如果您知道指向INT的指针的大小完全是4,那么您也可以写

C:
*(++ t_ptr)= 6;
在T_PTR上使用++(预增量)运算符。

都清楚了吗?
MRCHIPS.

MRCHIPS.

加入2009年10月2日
23,191
您还没有提供足够的信息。
首先告诉我们您正在运行的MCU。
接下来,您使用的是什么IDE(编程平台)?
j

螺纹启动器

JEY11

加入2010年6月7日
25.
如果有一种简单的方法来完成你想要的东西,这将是很好的,但事实是这样做需要一些你正在进行的环境和编译器的环境知识。也是答案不是唯一的情况。我们在谈论什么样的汇编者,我们在谈论哪个C编译器?

在上面的第一个例子中,你已经给了自己想要的东西。我不知道你觉得你错过了什么。您已经取了一个十六进制常量(我认为它代表某个处理器内存空间中的绝对地址),对该常量进行了强制转换,创建了一个指向整型数的指针,并将其赋值给一个名为T_ptr的变量。您还指出T_ptr是易失性的,这意味着编译器不能依赖于能够读回它刚刚写入到T-ptr的内容。

我猜这两个汇编语言指令是什么意思,但如果我们可以依靠T-ptr分配给它的值,也就是说,一个指针地址0 xff202000,你要做的是写什么地址+ 4价值“6”,然后下面的“可以理解”,你的编译器:

C:
*(t_ptr + 4)= 6;
应该这样做。这不是肯定的,不是某些,但可能是。如果您知道指向INT的指针的大小完全是4,那么您也可以写

C:
*(++ t_ptr)= 6;
在T_PTR上使用++(预增量)运算符。

都清楚了吗?
感谢您的解释并尝试启动时钟ARMv7系统模拟器(01xz.net)当我单击按钮0时模拟器。

按钮部分尚未实现。当呼叫开始功能,时钟不功能。我做的不对。

谢谢你的帮助。

我的函数是


int startclock(void)

{
挥发性int开始;
start = *(t_ptr + 4);
*(t_ptr + 4)= 6;

返回开始;

}
j

螺纹启动器

JEY11

加入2010年6月7日
25.
时钟开始,但没有响应按钮。但我没有做错。见附件要求及用途ARMv7系统模拟器(01xz.net)模拟器。感谢您宝贵的时间。

1616251882411.png.

#define hex3_hex0_base 0xff200020
#定义xff200050 KEY_BASE 0
#define t_base 0xff202000


volatile int * key_base_ptr =(int *)key_base;
volatile int * hex_ptr =(int *)hex3_hex0_base;
volatile int * t_ptr =(int *)t_base;

int startclock(void)
{
挥发性int开始;
开始= * (KEY_BASE_ptr + 1);
*(t_ptr + 1)= 6;
返回开始;
}

int stopclock(空白)
{
挥发性int停止;
停止= * (KEY_BASE_ptr + 1);
*(t_ptr + 1)= 8;
退货停止;
}
V.

vanderghast

2018年6月14日加入
54.
大多数C编译器都可以显示它们产生的汇编代码。您的代码是否在C中工作?

所说的是,按钮推动“可能”升高或降低电压。我们通常通过处理事件来检测它,但也可以在循环上检查该电压的值时进行,通常通过GPIO引脚。它“似乎”你正在尝试使用中断。它可以是一个升高或下降沿。可以使用示波器来确认您的假设。您必须为GPIO端口启用中断的发射器,这取决于您所拥有的确切ARM实现,也是NVIC,各种中断的仲裁,它必须意识到它应该与每个例外情况有关/中断。只要NVIC可能不看那些非临界内部,只询问发射器就不会做任何良好的良好,从而使它们掩盖。你可以必须使整个系统上的(软)的中断,因为通过默认,它们可作为“掩蔽”作为一个基团(单标志时需要的指令的未中断序列有用的)被标记。您使用的MCU或Simulator对我来说是外国的,我无法提供更具体的细节。
Bobamosfet.

Bobamosfet.

加入2009年7月1日
1,587
我需要开始计时器,这个装配代码正常工作,但需要转换为C.任何援助非常感谢,

// #define t_base 0xff202000
// volatile int * t_ptr =(int *)t_base;
@获取地址
LDR R4,= 0xFF202000


以下需要援助....

@启动持续计时器
@ counting(0b0110)
Mov r1, #6
STR r1, [r4, #4]
如果您的编译器支持__inline__指令,则无需转换为C的内联程序集。了解如何使用您的编译器了解一下。
螺纹启动器 类似的线程 论坛 答案 日期
j 编程和语言 4.
S. 家庭作业帮助 15.
j 家庭作业帮助 6.
K. 微控制器 1
johnintx. 反馈和建议 8.
最佳