【问题标题】:How to convert C to Assembly, for a program that runs on the ATmega32U4 (connected to a Teensy 2.0)如何将 C 转换为汇编,用于在 ATmega32U4 上运行的程序(连接到 Teensy 2.0)
【发布时间】:2013-09-27 05:33:50
【问题描述】:

我在 C 语言中创建了一些简单的代码来更改输出的占空比,我正在尝试将其转换为汇编,以便我可以在那里对其进行编辑并提高效率。但是,代码是为连接到 Teensy 2.0 的 Atmega32U4 编写的,每当我尝试使用常用方法翻译它时,由于使用了库,它会引发错误(我认为)。

如果我知道如何用汇编编写代码,我会重做整个代码,但我对此一无所知。

代码如下,

#include <avr/io.h>
#define F_CPU 7800UL                // frequency of 7.8kHz
#include <util/delay.h>

int main()
{
DDRF = 0x00;            // all in F are input
PORTF = 0xFF;           // all inputs are set to low
DDRB = 0xFF;            // all in B are output
PORTB = 0x00;

while(1)
    {
    if (~PINF &(1<<PF1))            // 0.05 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(50);
        PORTB = 0x00;
        _delay_ms(950);
        }
    else if (~PINF & (1<<PF4))      //0.73 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(730);
        PORTB = 0x00;
        _delay_ms(270);
        }
    else if (~PINF & (1<<PF6))      //0.92 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(920);
        PORTB = 0x00;
        _delay_ms(80);
        }
    else
        {
        PORTB = 0b00100000;
        _delay_ms(500);
        PORTB = 0x00;
        _delay_ms(500);
        }
    }
}

我很确定我没有以最有效或最正确的方式编写此代码,但我上个月才开始学习 C。任何将其翻译成大会的建议将不胜感激。

【问题讨论】:

  • 为了准确性和效率,您可以使用定时器或PWN输出功能代替。这将更容易且更易于维护。
  • 参考用户手册或数据表,看看你的微控制器是否有PWM输出功能。然后使用它。如果没有,您可以实现state machine 或使用多个计时器来实现不同的占空比。

标签: c assembly translate atmega


【解决方案1】:

如果你的代码可以编译(如果你提到的错误是链接器而不是编译器错误)你可以编译到汇编器。

大多数 C 编译器使用“-S”或“-s”命令行选项来创建汇编文件而不是目标文件。

一些提示:大多数 C 编译器不支持像 0b00100000 这样的二进制数。也许您应该改用十六进制数字 - 至少要与其他编译器兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多