我想将一个相同的结构复制到另一个结构中,然后将其用作第一个结构的比较.问题是,当我这样做时,我的编译器给了我一个警告!我应该以其他方式做到这一点还是我做错了:
在标题文件中:
extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;
Run Code Online (Sandbox Code Playgroud)
在C文件中:
struct RTCclk RTCclk;
struct RTCclk RTCclkBuffert;
void FunctionDO(void)
{
... // Some Code
/* Copy first struct values into the second one */
memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk);
}
Run Code Online (Sandbox Code Playgroud) 我用谷歌搜索,我看到一个惊人的轻浮反应,基本上嘲笑提问者问这样的问题.
Microchip免费提供一些源代码(我不想在这里发布,以防万一.基本上,谷歌AN937,点击第一个链接,有一个链接"源代码"及其压缩文件).它在ASM中,当我看到它时,我开始睁大眼睛.我想将它转换为类似ac类型语言的东西,以便我可以跟随它.因为行如:
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
Run Code Online (Sandbox Code Playgroud)
可能很简单,但它们对我毫无意义.
必须有一些自动ASM到C的翻译器,但我能找到的是人们说它不可能.坦率地说,它不可能是不可能的.两种语言都有结构,这种结构肯定可以翻译.
谢谢.
有没有人设法配置VS2010来构建和调试PIC32单片机上的嵌入式项目?那里有没有教程?
使用WinGDB,我可以连接到gdb服务器以逐步执行vs2010中的代码(已经测试了这个编译和调试到linux目标).
微芯片开发工具似乎是基于gcc的修改副本,缺少gdb,但是有第三方mips编译器工具链可用于gdb.据我所知,微芯片调试接口是专有的,在此设置中无法使用,但PIC32支持JTAG调试,我有一个amoctec jtagkey 2,openocd支持.
我目前对方法的想法是:
我已经编写了一段时间的代码,但我不是经典的计算机科学培训,所以如果这个问题很荒谬,请放轻松我.
我一直试图找到一个确定答案的东西是,如果我在C中包含一个文件,我是否可以获得链接文件的整个内容,或者只是我使用的部分?如果它有10个函数,我只使用其中的1个函数,其他9个函数的代码是否包含在我的可执行文件中?这对我来说尤其重要,因为我正在研究微控制器并且内存非常宝贵.
感谢您对此问题的任何帮助.
我们正在开始一个基于微芯片PIC18F252的新项目.什么是最好的'c'编译器?
我正在使用HiTech PICC32为PIC32MX编写固件.我想避免的一个问题是,由于大多数引脚都有多个名称(例如AN0 = RB0 = CN2 = PGED1),我或其他人可能会意外地使用RB0而没有意识到AN0已被使用.(这实际上可能是灾难性的,因为错误配置模拟/数字引脚会导致过量的电流消耗和基本烟雾的释放.)
除了全面记录每个使用的引脚外,我还想知道是否有一种快速的方法可以在编码层面解决这个问题.我想要一个人们(主要是我自己)可以使用的宏,比如CLAIM_PIN(58),如果它运行两次会发出警告或错误.
(我不惜一切代价想要这个,如果唯一可能的解决方案太可怕或者不可维护,那么我会忘记它,只是为了迸发出眼泪或让自己着火或者其他东西而声名鹊起.我也看到了这个问题关于宏生成宏,它排除了这一点.)
我应该澄清一下:代码是用多个编译单元编写的(至少,我认为这就是这个短语的含义).我有一个.h/.c文件用于我的A2D代码,类似于SPI,同样适用于只使用某些I/O端口的各种外设.空间不是真正的问题,我的代码在PIC32MX上留下了足够的空间; 我也可以使用另一个__DEBUG标志来删除引脚检查代码以供最终使用.
问题:
是否做了if(SomeFunction() == TRUE)而不是做if(SomeFunction())某些类型的编码错误?我试图了解这是否可以防止某些隐藏的地雷,或者是否是某人编写代码并且不太明白如何评估表达式的结果.我明白,如果做得对,这两件事情的评价都是一样的.就像if(value == 42)并if(42 == value)评估相同 - 仍然,有些人更喜欢第二个版本,因为如果有人输错了==并且写入=而产生编译器错误.
背景: 我继承了一些4年或5年前由不在这里工作的人写的嵌入式软件.我正在进行一些重构以摆脱数百行函数和全局变量以及所有爵士乐,所以这个东西是可读的,我们可以继续保持它.代码是c用于pic微处理器.这可能相关也可能不相关.该代码有各种在它的尖叫奇怪的东西"不知道他们在做什么",但在这里我想了解是不是有一个很好的理由一个特定的模式(反模式?)
模式: 这里有很多if语句采用的形式
if(SomeFunction() == TRUE){
. . .
}
Run Code Online (Sandbox Code Playgroud)
其中SomeFunction()定义为
BOOLEAN SomeFunction(void){
. . .
if(value == 3)
return(FALSE);
else
return(TRUE);
}
Run Code Online (Sandbox Code Playgroud)
让我们忽略SomeFunction从if语句的主体返回TRUE或FALSE的奇怪方式,以及他们使'return'看起来像函数调用的奇怪方式.
这似乎打破了c认为'true'和'false'的正常值.就像,他们真的想确保返回的值等于任何被定义为TRUE的值.这几乎就像他们正在制作三种状态 - TRUE,FALSE和'其他'而且他们不希望在返回"其他东西"的情况下采用'if'语句.
我的直觉是,这是一种奇怪的反模式,但我想给这些家伙带来怀疑的好处.例如,我认识到if(31 == variable)看起来有点奇怪,但它是这样编写的,所以如果你输错了==你不会意外地将31分配给变量.如果这些人写了这个保护措施来防范类似的问题,或者这只是胡说八道.
附加信息
typedef enum _BOOLEAN { FALSE = 0, TRUE } BOOLEAN;所以从一开始我绝对不是计算机工程师,但我正在努力学习.感谢爸爸,我发现了一些(93C46CB3)芯片以及一些其他不起眼的芯片.我研究了数据表,并找出哪些引脚在芯片上做了什么,但我还没弄清楚如何读取和写入它.它说它是串行的,但它没有说它是什么波特率.此外,它没有说我应该多快开启和关闭引脚.它使用PWM吗?如果是这样,有多快?数据表在这里
http://www.datasheetspdf.com/datasheet/93C46CB3.html
PG.图7是用于读写的图表,但没有说明这些间隔有多长."S""D"和"Q"都是引脚btw.
我正在尝试使用Arduino和Raspberry Pi来读取和写入其内容,无论哪种方法都可以使用它.提前致谢!
tldr; 我为这个芯片打开和关闭引脚的速度有多快,如果它有串行通信,它的波特率是多少?
我想知道是否有办法通过include或头文件或类似的东西将外部二进制文件作为C中的变量加载.
例如,在我正在进行的项目中,我正在使用嵌入式系统,该系统具有使用ASCII数据和命令进行文本和次要图形(框,线等)的图形显示.但是,它也会显示单色位图.所以我有一系列用于用户界面的静态显示,以及一些用于启动画面的位图.
现在我提到它是一个嵌入式系统的原因是没有文件系统来加载数据,只有RAM和程序存储器,所以我希望使用的任何"预制"数据或表必须在编译时加载通过源文件或使用链接器的目标文件.遗憾的是,IDE没有提供任何手段将任何形式的二进制文件加载到程序存储器中,以任何易于识别的方式以这种方式用作数据高速缓存.
如此缺乏做我已经解决的问题,(使用十六进制编辑器将二进制文件读取为ASCII编码的十六进制,并将原始数据作为变量复制并粘贴到头文件中),有没有办法"链接"到文件或"包含"可以在编译时作为const变量加载的文件?
我正在使用的系统是用于Microchip系列处理器的MPLAB X,编译器是GNC.在我尝试通过特定的编译器/链接器软件寻找方法之前,我主要想知道是否有办法通过某些C命令或函数执行此操作.
我大多是用C自学的。我对嵌入式微控制器进行编程。(例如,dsPIC33fj128gp804)我通常使用全局变量,而我曾经读过的所有内容都使用全局变量来谴责,因为它们就像瘟疫一样。我一直在努力减少使用,但是有一种情况我不知道如何不使用全局变量。
微控制器配有中断。中断是硬件外部触发的事件。触发中断后,将停止执行主代码,保存当前工作变量,执行预分配的功能,然后从停止的地方重新开始选择主代码。由于中断是一个独立的函数,可以随时触发,因此无法传入或传出任何函数。
例如,当UART硬件接收到一个字节的数据时,该数据需要先移出硬件缓冲区,然后才能被覆盖。
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
GlobalVariable = U2RXREG; // Move data to global variable
IFS4bits.U2RXIF = 0; // Clear the UART2 Receive Interrupt Flag
}
Run Code Online (Sandbox Code Playgroud)
有没有全局变量的方法吗?还是这是例外?
microchip ×10
c ×8
embedded ×6
arduino ×1
assembly ×1
binary-data ×1
c++ ×1
copy ×1
mikroc ×1
mplab ×1
pic ×1
pic18 ×1
raspberry-pi ×1
serial-port ×1
struct ×1