首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PWM波产生

PWM波产生
EN

Code Review用户
提问于 2015-10-21 18:23:21
回答 1查看 50关注 0票数 3

此代码以范围x的整数0,127作为输入,返回一个由4个32位整数组成的数组,其中设置了x位。

我正在尝试最大限度的切换,以便更容易地过滤掉输出中的波纹。另一个考虑是要快速运行,因为这段代码运行在MCU上(确切地说,是XMOS)。

尽管此代码按预期工作,但我并不100%相信这是好代码。

代码语言:javascript
复制
static inline unsigned int genMask(unsigned int x)
{
    unsigned int ret=0;
    ret|=(x&0x00000001)?0x80000000:0;//x 1/32
    ret|=(x&0x00000002)?0x00008000:0;//5 1/32
    ret|=(x&0x00000004)?0x00800080:0;//4 1/16
    ret|=(x&0x00000008)?0x08080808:0;//3 1/8
    ret|=(x&0x00000010)?0x22222222:0;//2 1/4
    ret|=(x&0x00000020)?0x55555555:0;//1 1/2
    return ret;
}
static inline void genPWM(unsigned int *p, unsigned int xm)
{
    unsigned int temp = genMask(xm>>1);
    p[0] = temp;
    p[1] = temp;
    p[2] = genMask(((xm>>1)&0xfffffffe)|(xm&0x00000001));
    p[3] = genMask((xm>>1)&0xfffffffe);
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2015-10-21 18:36:49

三次调用几乎相同的

您目前正在使用几乎相同的参数三次调用gen_mask()

代码语言:javascript
复制
genMask(xm>>1);
genMask(((xm>>1)&0xfffffffe)|(xm&0x00000001));
genMask((xm>>1)&0xfffffffe);

注意,在每种情况下,只有0x1位是不同的。因此,您可以首先生成它的0x1位清除:

代码语言:javascript
复制
genMask((xm>>1)&0xfffffffe);

然后你可以根据它们的0x1位来计算其他的。

所以你的代码会变成:

代码语言:javascript
复制
static inline void genPWM(unsigned int *p, unsigned int xm)
{
    unsigned int temp1 = genMask((xm>>1) & 0xfffffffe);
    unsigned int temp2 = temp1 | ((xm & 1) ? 0x80000000 : 0);
    unsigned int temp3 = temp1 | ((xm & 2) ? 0x80000000 : 0);
    p[0] = temp3;
    p[1] = temp3;
    p[2] = temp2;
    p[3] = temp1;
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/108303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档