我正在运行Ubuntu 10.04和Wine 1.2.我能够安装IAR软件,但无法找到加密狗许可证.无论如何在Wine和Ubuntu中使用加密狗许可证还是我必须使用PC许可证?
提前致谢..
我试图将C项目转换为C++.
在C项目中,我在编译成c ++时反击了这个错误:
错误[Pe513]:无法将类型为"void*"的值分配给"uint8_t*"类型的实体
以下代码给出了此错误:
#define RAM32Boundary 0x20007D00
uint8_t *pNextRam;
pNextRam = (void*)RAM32Boundary;// load up the base ram
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这在C中做了什么以及如何将其转换为C++?
我正在使用带有10K RAM的MSP430芯片.如果我超过5k的RAM使用量,它永远不能进入main().init代码调用__data20_memzero清除已用RAM空间.

它看起来像是通过内存递增并清除字节直到R14 = R12.R14是0x34B4.但是在重新启动并重新开始之前,R12的最大值为0x2c86.我通过调试器手动关闭了看门狗,它开始运行就好了.我不能认为这是正常的.知道如何解决这个问题吗?
我的应用程序调用了一些放置在外部静态库中的函数。我将外部静态库链接到我的应用程序,一切正常(在这种情况下,我使用的是 GCC)。
然而,库的文本、.data 和 .bss 部分的位置(地址)由链接器选择。我可以通过修改链接器脚本来选择/更改它们的位置,但是这很乏味,因为我必须指定库的所有函数、变量等。我的意思是这样的:
. = 0x1000; /* new location */
KEEP(*(.text.library_function1));
KEEP(*(.text.library_function2));
[...]
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是通过为每个函数/变量放置一个段属性来构建外部库,然后通过重新定位整个段来修改链接器。就像是:
/* C source file */
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10];
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10];
/* Linker script */
. = 0x1000;
KEEP(*(.myLibrarySection))
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够重新定位外部静态库的整个 .text、.data 和 .bss 段,而无需使用这些技巧。
我想要这样的东西(在链接脚本中):
. = 0x1000;
KEEP(*(.text.library_file_name))
Run Code Online (Sandbox Code Playgroud)
是否可以使用 GCC 工具链?
是否可以使用其他工具链(IAR、Keil 等)?
我正在将一个ARM芯片的程序从IAR编译器移植到gcc.
在原始代码中,IAR特定的运算符如__segment_begin和__segment_size用于分别获取某些内存段的开头和大小.
有没有办法和海湾合作委员会做同样的事情?我查了GCC手册,却找不到任何相关内容.
更多细节:所讨论
的存储器段必须位于固定位置,以便程序可以正确连接芯片上的某些外设.原始代码使用__segment_begin运算符来获取此内存的地址,并__segment_size确保它不会溢出此内存.
我可以通过添加变量来指示这些内存段的开始和结束来实现相同的功能,但是如果GCC具有类似的运算符,这将有助于最小化编译器相关代码的数量,我最终必须编写和维护.
我有一个配置结构我想保存在ARM cortex M3的内部闪存上.根据规格,数据保存在内部闪存中,必须与32bit对齐.因为我有很多boolean和chars在我的结构中,我不想使用32位存储8位...我决定使用__packed预处理器编译指示打包结构,然后当我将它保存为整个结构时,我只需要确保结构大小可被4整除(4个字节= 32位),如果需要,我可以通过添加填充字节来实现.目前,在开发过程中我经常更改结构,并使其与32位对齐,我需要一直更改填充字节.目前,结构看起来很像
typedef __packed struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...] // this has to be changed every time I alter the structure.
} CONFIG;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现我正在做的事情?我是嵌入式编程的新手,我想确保我没有犯错误.
编辑:请注意.数据在内部闪存结束时保留,因此省略填充将无法正常工作......
我想调试我的代码并且无法访问过程中的内部层,因为这会干扰与硬件的通信。(在监视列表会干扰基本读取访问的地方执行易失性操作。)
所以我正在测试接口的返回值,但 IAR 编译器甚至优化了未使用的 volatile 变量。
和这样的声明:
i = object.foo();
if (i)i=i;
Run Code Online (Sandbox Code Playgroud)
也没有帮助。
我在这里找到了 SO 只是回答了该案例使用 i/o 操作的建议。但这也不是选项,因为我没有包含 C 标准库的选项。并且项目本身不需要输入/输出,没有自己的输入/输出功能变体。
那么除了禁用优化器之外,我还有哪些选择?
有一个供应商的软件,我想与之合作.他们有一个代码库,他们只能使用IAR Embedded Workbench进行编译(据我所知,他们的代码不能用GCC编译).不幸的是,他们的硬件仅适用于他们的软件堆栈,所以我真的无法选择是否要使用它.它们将此代码分发.a为为ARM Cortex-M4 CPU编译的静态库文件(以及随附的标头).(他们不想分发来源.)为了这个讨论,让我们称之为evil_sw_stack.a.
我想使用这段代码,但我没有IAR许可证,对IAR没有专业知识.我想使用GCC.
有没有办法让IAR生成GCC可以链接到的静态库?供应商需要使用哪种编译器选项来生成这样的二进制文件?
(我猜测得到的二进制文件的ABI可以某种方式指定并设置为满足GCC的设置.)
他们的默认软件堆栈非常适合GCC,这个特定的软件堆栈是他们提供的唯一一个不是.通常,如果我有以下内容,我可以编译一段简单的示例代码:
startup_(devicename).S:GCC特定的程序集文件system_(devicename).c(devicename).ld:链接器脚本例如,我可以编译一个简单的例子,如下所示:
$ arm-none-eabi-gcc helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.没有警告,没有错误.
为了这个讨论,让我们称之为evil_sw_stack.a.
这就是我尝试使用它的方式:
$ arm-none-eabi-gcc evil_sw_stack.a helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
不幸的是,这抱怨了一系列定义的函数的多个定义system_(devicename).c.也许他们不小心把它编成了这个库?或者也许IAR只是这样编译?现在,如果我尝试system_(devicename).c …
有没有办法保存 IAR 窗口布局?每次我启动调试会话时,它都会在我的屏幕上填满 9 个不同的窗口。我会很高兴有 3 个和几个选项卡,但我每次都必须重新安排事情。我没有看到明显的方法来拯救它们,谷歌对此也没有太多可说的。