我用谷歌搜索,我看到一个惊人的轻浮反应,基本上嘲笑提问者问这样的问题.
Microchip免费提供一些源代码(我不想在这里发布,以防万一.基本上,谷歌AN937,点击第一个链接,有一个链接"源代码"及其压缩文件).它在ASM中,当我看到它时,我开始睁大眼睛.我想将它转换为类似ac类型语言的东西,以便我可以跟随它.因为行如:
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
Run Code Online (Sandbox Code Playgroud)
可能很简单,但它们对我毫无意义.
必须有一些自动ASM到C的翻译器,但我能找到的是人们说它不可能.坦率地说,它不可能是不可能的.两种语言都有结构,这种结构肯定可以翻译.
谢谢.
当然,这本身并不是一个编程问题......但我想不出一个更好的地方来问这一切.
我正在编写一个应用程序,最终将帮助购物者确定如何在特定网站上实现最大的节省.该网站提供几乎所有产品的两种价格 - 正常价格和折扣价格.任何人都可以享受折扣价,但只有一个折扣商品可以添加到任何给定的订单中.只有这些信息,激励是最小化您的订单siz,而是放置多个订单.另一方面,总运输成本由订单大小(按重量)决定,因此激励是最大化订单大小并仅放置一个订单.
我正在寻找一种模型,以确定最有效的方式来平衡订单,因为一个项目的可用折扣和重量影响订单的运输成本.
我记得回到学校的时候我认为这是一个线性编程问题......但我记得那个课程是多么令人困惑.
任何人都有关于如何计算这个程序的数学技巧?
我正在试图找出一些为我们编写的固件.我不是那么熟悉C,我觉得这里有一些简写,我只是没有得到.我不明白代码与评论的关系,特别是你如何从中获得70毫秒.你能帮忙翻译成英文吗?
// so the button has to be held for 70 ms to be considered being pressed
// and then has to be released for 70ms to be considered un-pressed
State=(State<<1) | !input(USER_BUTTON) | 0xe000;
if(State==0xe000)
{
Debounced_Button_Pressed = TRUE;
time_button_held++;
}
else if (State==0xffff)
{
Debounced_Button_Pressed = FALSE;
}
Run Code Online (Sandbox Code Playgroud)
这是一个定时器中断功能,显然每4.4ms发射一次
谢谢.
我不确定我知道怎么问这个.
说我有功能
void myFunc ( int8 foo, float bar, int whatever )
{
...
}
Run Code Online (Sandbox Code Playgroud)
是否有一种通过其位置引用特定参数的快速方法?
void myFunc ( float foo, float bar, float whatever )
{
float f;
f = ARG[1]; // f now equals bar
}
Run Code Online (Sandbox Code Playgroud)
有什么影响?
跟进:
谢谢你们的答案.我想我错了.我发现奇怪的是c ++不允许这样做,因为perl和一些伪语言(我特别想到AutoIt).至于"为什么"?只是使用一个简单的循环来完成它们.我认识到在正常情况下有很多更好的方法可以达到这个目的,但是我最不愿意在我的小世界之外修改任何人的代码.换句话说,我无法控制调用代码.它将输入推到我的喉咙,我必须尽可能地管理它们.所以我不能在调用我的函数之前循环.无论如何,它显然是一团糟,并没有那么多变量,所以我只是重复代码.没什么大不了的.感谢您的评论和有趣的建议.
对于十六进制,我的大脑放屁很多.有些人是灵巧的,而其他人只是简单的右手...好吧,有点像那样,我猜我是非常基础的.
无论如何......我正试图让一些固件更有效率.我们有一个功能,它根据通过CANBUS获得的一些十六进制数据来计算车辆的速度.现在我正在将它转换为浮点数,所以我可以把它包裹起来,但是我想知道如果我们把它留在整数格式中,我们是否会使用更少的ROM空间?这可以做到而不会失去准确性吗?现在我的花车精确到1/16千瓦时.我知道这个功能看起来很简单,但是每秒运行数百次就会让它变得有点麻烦.
首先,这是一些示例数据:
[06] [3c] ...... [06] [3a] ... [06] [3b] ...... [06] [46] ... [06] [3b] ...
我已经将其他6个字节留下,因为它们与速度无关.左边的字节我们称之为speed_a,右边的字节是speed_b.这是转换的功能:
float calculateSpeed()
{
float speed;
speed = ( ( float )speed_a * 256.0 + speed_b ) / 16.0;
return speed;
}
Run Code Online (Sandbox Code Playgroud)
所以上面的数据会转化为:
99.7500 99.6250 99.6875 100.3750 99.6875
这确实反映了以kph为单位的车辆的真实速度.对于我们的应用,我们并不关心真正的速度是什么,因为一切都是相对的.只要我们不失去决心,我们就会感到高兴.我想过只保留INT形式的所有内容,但是当你除以16时它只是截断.
我对大多数事情都不是个白痴......但我对base2来说是个白痴.
Lil'帮忙吗?谢谢.
我已经提炼出一个方程式:
speed = ( ( rear_wheel_speed_a + front_wheel_speed_a ) << 10 ) +
( ( rear_wheel_speed_b + front_wheel_speed_b ) << 2 );
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,我得到了意想不到的结果,所以我一定做错了.这开始是这样的:
speed = ((((rear_wheel_speed_a * 256 + rear_wheel_speed_b) / 16) +
((front_wheel_speed_a * 256 + front_wheel_speed_b) / 16)) / 2) * 128;
Run Code Online (Sandbox Code Playgroud)
这是完全没有简化的版本.它们不是数学上的等价物吗?
所有值都是16位整数.示例数据集是:
rear_wheel_speed_a = 0x03;
rear_wheel_speed_b = 0x6F; //<-- I originally swapped
front_wheel_speed_a = 0x02; //<-- these two values. Sorry!
front_wheel_speed_b = 0xE2;
Run Code Online (Sandbox Code Playgroud)
归结为6468的答案.但在第一个等式中,我的应用程序表现得好像它至少小3%或更大.我这样说是因为这是一个嵌入式应用程序,我无法确认计算结果,只能测试它是否在"正常"的某个范围内.当我使用第二个等式时,它属于参数,但是我的"简化"(位移)方程式并不是这样,我认为我必须不正确地进行移位(或者我简化了错误,但我对它进行了三次检查).
非常感谢,谢谢.
有一个应用程序,我在XP上网本上用于调整汽车.它运作得很好.然后我需要做一个简单的修改(输出到STDOUT而不是文件),所以我从作者那里获得了源代码.
我的上网本没有编译器的空间.我在Windows 7桌面上安装了Visual Studio C++ 2008.我在桌面上进行了调整,编译和测试,它运行得很完美.然后我将可执行文件复制到上网本,它将无法运行
"此应用程序无法启动,因为应用程序配置不正确.重新安装应用程序可能会解决此问题"
原始(预编译)exe工作正常.为了排除我的更改,我编译了没有mod的源代码,但它仍然无效.可执行文件在7机器以及我尝试的另一台Win Vista机器上工作正常.
所以它显然与XP机器和可执行文件的编译方式有关.我真的不知道这些东西是如何工作的,所以我不知道该尝试什么.
我的编译器不能使用我拥有的汇编文件和我的其他编译器,它将无法使用我拥有的c文件.我不明白集会.我需要移动它,但我没有快速到达任何地方.那里有人可以提供帮助吗?我无法相信没有翻译.这是文件的开头:
list p=18F4480
#include <p18F4480.inc>
#define _Z STATUS,2
#define _C STATUS,0
GLOBAL AARGB0,AARGB1,AARGB2,AARGB3
GLOBAL BARGB0,BARGB1,BARGB2,BARGB3
GLOBAL ZARGB0,ZARGB1,ZARGB2
GLOBAL REMB0,REMB1
GLOBAL TEMP,TEMPB0,TEMPB1,TEMPB2,TEMPB3
GLOBAL LOOPCOUNT,AEXP,CARGB2
LSB equ 0
MSB equ 7
math_data UDATA
AARGB0 RES 1
AARGB1 RES 1
AARGB2 RES 1
AARGB3 RES 1
BARGB0 RES 1
BARGB1 RES 1
BARGB2 RES 1
BARGB3 RES 1
REMB0 RES 1
REMB1 RES 1
REMB2 RES 1
REMB3 RES 1
TEMP RES 1
TEMPB0 RES 1
TEMPB1 RES 1
TEMPB2 RES 1
TEMPB3 …
Run Code Online (Sandbox Code Playgroud) 今天敲我的头;)
在这里,我询问了如何将ASM文件转换为C,并且从响应中看起来没有合理的方法来执行它.精细.因此,其中一个回复建议我只是按原样使用函数并完成它.听起来不错.
但是怎么样?
神圣的废话我已经尝试了我能想到的一切!我正在使用Microchip品牌的MCU(PIC18F4480)和Microchip品牌的IDE(MPLAB IDE),而ASM文件是Microchip编写的...所以你认为我会找到一些方法来使用它们!到目前为止还没有运气.
我对ASM(汇编)一无所知.我用C++编写代码,坦率地说,这不会改变.必须有一种方法可以访问Microchip ASM文件中的函数,而无需用新语言重写我的所有代码.
如果有人想看看,ASM文件和应用笔记就在这里.
我正试图摆脱我的功能中的花车.
我有一个函数操作16位整数值,这是一个升级的8位值.然后将缩减的8位发送到输出.
我相信我不会很好地解释它.像这样的东西:
int8 spot_value = 21; //arbitrary. just need a starting point
int16 running_value;
running_value = spot_value << 8; //multiply by 256 which is 5376
running_value += 154; //my upscaled value is now 5530
spot_value = running_value >> 8; //downscale again
Run Code Online (Sandbox Code Playgroud)
如果我们使用浮点数,我的缩减值将是21.6,我可以轻松地将其舍入为22并转换为int8.但是它会截断到21,这是我不想要的.
有没有办法"整理"整数,如果它是合适的,如果它是一个浮点数但没有将任何东西转换为浮点数(甚至是暂时的)?
这可能比我做到的要简单得多.