Tag: 嵌入

C全局匿名结构/联合

我有一个uint64变量,通常只需要高或低32位访问。 我使用的是32位ARM Cortex M0,为了提高速度,我试图将uint64变量与C中的两个uint32变量重叠,使用匿名结构,希望避免指针算法访问成员。 我正在尝试做什么? 可能是使用命名联合同样快,但现在我只是感兴趣,如果它可以没有。 以下内容无法成功编译: http://goo.gl/ejx37y #include volatile union { uint64_t ab; struct { uint32_t a, b; }; }; int main(void) { a = 1; };

嵌入C语言时的Python语法错误

我有一个python文件,当我对我的python解释器执行它时运行正常。 我正在尝试使用python C API从C程序调用相同的文件: #include #include int main(int argc, char* argv[]){ FILE* fp; Py_SetProgramName(argv[0]); Py_Initialize(); PySys_SetArgv(argc, argv); fp = fopen(“floatcli.py”, “r”); PyRun_SimpleFile(fp, “floatcli.py”); Py_Finalize(); } 但是,当我运行这个时,我得到一个python语法错误: File “floatcli.py”, line 1 üBa ^ SyntaxError: invalid syntax (在这里没有显示的BBa中还有一个装在盒子里的?)。 floatcli.py的第一行只是一个导入语句……任何想法是怎么回事?

嵌入Python 3.3

我尝试嵌入Python 3.3,如此处所述。 我在使用Python 2.7的MacOS 10.8上,所以我从python.org下载了3.3版的二进制发行版。 从它我得到了所有标题和“Python”,我重命名为“python33”所以它不会与安装的“Python”lib发生冲突。 我把所有东西放到一个文件夹中 embed.c / include python33 “文件python33”说: python33 (for architecture i386): Mach-O dynamically linked shared library i386 python33 (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 和embed.c是: #include int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString(“print ‘test’\n”); Py_Finalize(); return 0; } 但是当我做“gcc embed.c -I./include -L.-lpython33”时,它打破了: ld: library not […]

Py_InitModule4()在嵌入式Python解释器上返回NULL(使用Cython)

我正在使用Cython编写C-Plugin。 最后,这应该将Python-Interpreter嵌入到Windows上的iTunes中。 为了使其工作,需要一个引导程序 。 它实现iTunes插件入口点,初始化或最终确定,或者任何需要,然后调用从Cython生成的代码。 我在Windows 7 64Bit和CPython 2.7上使用MinGW gcc 4.6.2 。 前言 Windows上的iTunes插件入口点称为iTunesPluginMain 。 据我所知,实现插件的共享库不会一直保持iTunes运行,因此一旦调用入口点就无法存储任何全局变量。 这就是为什么iTunes要求开发人员将void*指针存储到每次调用iTunesPluginMain传递的句柄。 iTunesPluginMain进行多次通知,例如初始化和清理。 引导程序看起来像这样: /** coding: utf-8 file: bootstrap.c Copyright (c) 2012 by Niklas Rosenstein This file implements the bootstrapper for loading the PyTunes plugin. **/ #include #include #include #include #include “pytunes.c” #define EXPORT(type) __declspec(dllexport) type extern void initpytunes(void); extern […]

嵌入式系统C中最快的arrays查找算法?

假设我有一个定义大小为22的常量浮点数,如下所示: array[0]= 0; array[1]= 0.5; array[2]= 0.7; array[3]= 1.8; … … array[21]= 4.2; 这个数组的值是单调的,也就是说,它们总是随索引而增加(array [0] <= array [1] <= array [2] <= …. <= array [21])。 我想要一个给定一个浮点数的函数,它找到数组的索引,其值正好在输入浮点数之下(因此,下一个索引的值紧接在上面) 例如,在前一种情况下,如果函数的输入值为0.68,则函数的输出应为1,因为数组[1] <= 0.68 现在,这很容易实现,但我正在处理嵌入式系统中代码的一个非常时间关键的部分,我真的需要一个非常优化的算法,它避免了循环(以避免开销)。 我现在使用的最简单的方法就是用if-elses展开循环,就是这样。 例: if(input >= array[size-1]) return size-1; else if(input>= array[size-2]) return size-2; else if(input >= array[size-3]) return size-3; … … 但这里的问题是我有抖动,因为不同输入的路径需要明显不同的时间。 所以我的问题是:是否有最快,更确定(更少抖动)的方式来实现它? 谢谢。 乔治。

将结构放入闪存(微控制器)的最常用方法是什么?

我正在使用GCC for ARM V-4.8.3工具链进行嵌入式C项目。 我有一系列查找结构,只在整个程序的生命周期中读取。 由于我的RAM耗尽(并且有大量的Flash未使用),最好将它们推入闪存,这不会影响程序的function。 问题是如何。 一种方法是使用GCC提供的variable __attribute__ ((section (“TEXT”))) 。 在这种情况下,我的代码依赖于编译器。 例如,如果我想使用Microchip编译器使用我的代码,我需要编辑代码以移植到新环境。 我想到的另一种方法是使用链接器脚本。 该结构仅在代码中声明。 在我看来,第二种方法更便携。 虽然仍然需要调整链接器脚本,但对我来说它更好。 是否有更通用的方法可以使代码更容易进入将变量放入闪存的上下文中? 将它们定为常数,意味着它们将被置于rodata部分。 不要进入他们“属于”的文本部分。

我在哪里可以找到一个简单的图形C库直接写入帧?

我需要一个简单的图形C库来在我将直接写入帧的设备上使用。 框架位于常规存储器中。 没有图形加速硬件。 没有什么花哨。 我只是想绘制线条,圆圈,OSD之类的字符串。 拥有使用优质精益算法的function会很棒(我的CPU是运行在400MHz的ARM9)。 有什么建议吗?

如何从偶数地址边界开始填充带有两个字节值的S记录?

当我编译我的代码时,我最终获得了带有间隙的摩托罗拉S记录 ( a.mot )(整个地址范围不包含在代码和数据中)。 我想用模式0x01 0x80填补这些空白。 但是,重要的是所有双字节对必须从偶数地址开始。 0x0180是我的micro的操作码,如果PC到达未使用的闪存区域的地址,我想要执行。 在你开始回答之前我想告诉你srec_cat中的-repeat -data有一个问题: 给定两个部分,例如C和D在地址空间中一个接一个地放置( C之后的D )。 假定C部分的最后一个字节在地址0x76上结束,而部分D的第一个字节在地址0x78 。 换句话说,它们之间的地址0x77处有1个字节的长间隙。 在这种情况下,如果我使用-repeat -data 0x01 0x80选项,srec cat将用0x01填充该一个字节,并从0x80开始填充以下间隙。 我不知道这些部分的大小,因为链接器处理它。

将mono编译为静态库

我想在Windows上将libmono编译为静态库。 目标平台是Windows x86。 构建环境:Windows 7 64位,VC ++ Express 2010 我已经做了什么。 1)下载单声道2.10.8源。 2)从msvc文件夹中打开mono.sln并确保一切正在进行。 3)然后我做了一些改变: 3.1)常规 – >项目默认值 – >配置类型:静态库(.lib) 3.2)常规 – >项目默认值 – >使用MFC:使用标准Windows库 3.3)C / C ++ – >代码生成 – >运行时库:multithreading(/ MT) 4)构建它并且VC ++ 2010成功创建了mono-2.0.lib 5)在我自己的项目的链接器输入中添加它(我想嵌入单声道): 5.1)常规 – >项目默认值 – >配置类型:应用程序(.exe) 5.2)常规 – >项目默认值 – >使用MFC:在Ststic库中使用MFC 5.3)C / C ++ – >代码生成 – >运行时库:multithreading(/ MT) […]

16位int机器(MSP430)和32位int机器(ARM CORTEX)的减法结果不同

当下面的代码针对像MSP430微控制器这样的16位整数机器运行时, s32产生65446。 #include uint16_t u16c; int32_t s32; int main() { u16c = 100U; s32 = 10 – u16c; } 我的理解是10-u16c将隐式类型提升为unsigned int。 数学上10-u16c等于-90。 但是如何将负数表示为unsigned int呢? 当-90被提升为unsigned int时,是否意味着忽略了数字的符号? 让我们假设,数字的符号被忽略。 90的二进制表示是00000000 01011010 。 当这被分配给32位宽的有符号整数变量s32 ,转换是如何发生的? 为了使s32等于65446,90必须采用2的补码。 那将是00000000 10100110 。 我不太了解s32成为65446的过程。 在像ARM这样的32位宽整数机器中, s32是-90,这是正确的。 要在16位整数机器中修复这种情况, (int16_t)需要(int16_t)的类型转换。 这如何解决这个问题? 添加了s32六进制数据表示,如IAR Workbench(右下角)所示。 结果表明s32变为0x0000FFA6 。 因此对于MSP430,从无符号16位转换为有符号32位的机器实现,它只是预先设置16 0位。