我正在尝试运行以下批处理命令.该命令已从IDE中提取,因此已确认正在运行.得到下面提到的错误.
我用双引号尝试了一些变化,但它们没有用.即使在powershell上它也有相同的信息.
C:\Program Files\IAR Systems\Embedded Workbench 7.0\430\bin\icc430.exe F:\CP001\source\Meter\Main.c -D Hardware_P20E -D Calibration_code -D _Optical -D _Configuration_TS0382 -o F:\CP001\Temp\C20EO\Obj\ --no_cse --no_unroll --no_inline --no_code_motion --no_tbaa --debug -D__MSP430F425 -e --double=32 --dlib_config C:\Program Files\IAR Systems\Embedded Workbench 7.0\430\lib\dlib\dl430fn.h -Ol --multiplier=16 --segment __data16=DATA16 --segment __data20=DATA20
Run Code Online (Sandbox Code Playgroud)

更新:
尝试使用引号解决方案会以某种方式混淆编译器

我只使用过AVR和MSP430,但对于这两种情况都是如此.在编译和静态链接之后,我的最终ELF二进制文件大约为208kB,而Intel Hex二进制文件大约为41kB.AVRDUDE告诉我上传大约18kB.这里到底发生了什么?
我有一个关于以下代码的问题:
#include "all_needed.h"
static uint8_t array[2] = {0};
void main(void)
{
...
}
Run Code Online (Sandbox Code Playgroud)
允许如上所述初始化(模块)全局数组,以使每个成员在ANSI C符合时设置为零吗?
我在Code Composer 5(MSP430项目)中遇到了问题,我不得不将其更改为
static uint8_t array[2] = {0, 0};
Run Code Online (Sandbox Code Playgroud)
用于正确初始化阵列的第二个成员.
我正在尝试使用CMake构建一个项目,该项目使用MSPGCC交叉编译器来实现MSP430微控制器.要使用它成功编译任何简单程序,我们需要传递一个指示目标处理器的编译标志,否则它会像这样失败:
$ msp430-gcc -o test test.c
In file included from test.c:1:0:
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/include/msp430.h:813:2: warning: #warning Unable to identify and include MCU header, use -mmcu=MCU [-Wcpp]
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld: cannot open linker script file memory.x: No such file or directory
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
因此,如果我使用-mmcu开关指示处理器,它可以正常工作.问题是,虽然我已经在我的CMakeLists.txt文件中指定了这个:
cmake_minimum_required (VERSION 2.6)
project (test-project C)
set (SOURCES
test.c
)
add_executable (test-project ${SOURCES})
set (CPU_FLAG "-mmcu=msp430f148")
set (CMAKE_C_FLAGS ${CPU_FLAG})
set (CMAKE_EXE_LINKER_FLAGS ${CPU_FLAG})
Run Code Online (Sandbox Code Playgroud)
CMake的抱怨编译器测试失败编译一个简单的程序,我敢打赌,因为它可能是发生未使用的-mmcu开关(注意有关无法打开链接脚本文件memory.x消息):
$ cd ~/git/test-project
$ …Run Code Online (Sandbox Code Playgroud) 在不使用递归的C程序中,理论上应该可以计算出调用给定函数所需的最大/最坏情况堆栈大小,以及它调用的任何内容.是否有任何免费的开源工具可以从源代码或编译的ELF文件中执行此操作?
或者,有没有办法从ELF文件中提取函数的堆栈帧大小,所以我可以尝试手动解决它?
我正在使用MSPGCC 3.2.3编译MSP430(我知道它是旧版本,但在这种情况下我必须使用它).要分配的堆栈空间在源代码中设置,并且应该尽可能小,以便其余的内存可以用于其他事情.我已经读过你需要考虑中断使用的堆栈空间,但我正在使用的系统已经考虑到了这一点 - 我正在尝试计算出多少额外的空间来添加.另外,我已经读过函数指针使这很困难.在这里使用函数指针的少数地方,我知道它们可以调用哪些函数,因此如果已知调用函数和调用函数所需的堆栈空间,则可以手动考虑这些情况.
静态分析似乎比运行时的堆栈绘制更强大,但如果没有好的静态方法,那么在运行时进行静态分析是一种选择.
编辑:
我找到了GCC的-fstack-usage标志,它在编译时保存了每个函数的帧大小.不幸的是,MSPGCC不支持它.但是对于那些试图在不同平台上做类似事情的人来说,这可能是有用的.
在msgpcc(GSP for MSP430微控制器)手册中,作者写道:
如果要在函数中使用小整数,请使用int而不是char或unsigned char.生成的代码将更有效,并且在大多数情况下,实际上不会浪费存储.
为什么int效率更高?
UPD.为什么(u)int_fast8_t在mspgcc中定义(unsigned) char,而不是(unsigned) int.据我所知,(u)int_fast*_t应该定义为具有足够大小的最有效类型.
假设我有下面的MSP430装配部分:
R15:
439c
Run Code Online (Sandbox Code Playgroud)
记忆地图:
4390: 6045 0200 9c43 6400 8844 5044 363a 0000
Run Code Online (Sandbox Code Playgroud)
码:
448a: cmp #0x363a, 0x0(r15)
4490: jnz $+0x1c
4492: Code continues
.
.
.
44ac: Jump to location
Run Code Online (Sandbox Code Playgroud)
目标是让Z标志高.要使用cmp执行此操作,src和dst必须相等.如果我在r15的内存位置有363a,为什么生成的cmp不会触发Z标志?
通过实验,我发现将3a36放在r15的内存位置实际上触发了Z标志,但我不明白为什么.
如果有人能说明这一点,我将非常感激.
如果需要更多信息,我很乐意提供.
我正在使用带有10K RAM的MSP430芯片.如果我超过5k的RAM使用量,它永远不能进入main().init代码调用__data20_memzero清除已用RAM空间.

它看起来像是通过内存递增并清除字节直到R14 = R12.R14是0x34B4.但是在重新启动并重新开始之前,R12的最大值为0x2c86.我通过调试器手动关闭了看门狗,它开始运行就好了.我不能认为这是正常的.知道如何解决这个问题吗?
我之所以这么具体,是因为我正在尝试在msp430g2553平台上实现加密算法(RSA,AES,哈希函数,数字签名等).
我通过互联网搜索,并通过误导的绝望,我安装了Linux发行版,以便使用GMP,但失败了.我安装了Kali,然后安装了一个USB(2.0)棒上的Lubuntu ,只是因为无法忍受的冻结而受到影响,并且不知道它是否会起作用.后来尝试了VMBox的魔力,之后事情变得更容易了,虽然没有定论.我最终得到了一个点mps430-gcc和mspdebug,我可以调试一些示例代码,并看到它们工作,但仍然无法进行GMP操作,因为主要是库错误(未定义引用mpz_t init ...等) .
据我所知,GMP是一个用于特定处理器架构的多精度算术库,而MSP430不是其中之一,但是,在这一点上,如果它是其中之一,我不会感到惊讶.我得到的最佳答案是,一些TI员工对此并不熟悉.所以;
我几乎没有在谷歌上看到任何与gmp交叉引用msp430的东西,而我正在努力实现一个可怜的64位密钥大小的RSA,如果有的话,几乎不能正常工作.所以我希望这篇文章及其答案可以帮助某些人,并希望以后能够帮助我.
我也忘了提到,我已经阅读了遗物工具包,(但是没有花时间尝试实施它,因为GMP看起来更像是该领域的标准),我想知道:
感谢大家.