Tag: 嵌入式

如何使用putchar打印浮点值?

我正在研究嵌入式应用程序,需要打印浮点值。 由于空间和其他限制,我只能使用putchar()进行输出。 我正在尝试创建一个函数,它将float作为参数并使用putchar()进行打印。 我有一个类似的函数适用于整数值。 void putLong(long x) { if(x = 10) { putLong(x / 10); } putchar(x % 10+’0′); } 我怎么能为浮子做类似的function?

C语言中CRC16的文件validation混乱

在这里,我想知道如何为任何类型的文件实现计算CRC16, 在这里我对CRC16及其代码逻辑有所了解。 在这里我做了一个函数,它将文件路径作为输入并找出它的CRC值。 这里我在这个函数中传递文件名,这个函数计算这个文件的CRC值。 但我想计算所有类型的文件,如.tar,.tar.gz,.txt,.bin,.scr etc 。 所以在这里我打开所有文件和”rb”模式,并逐个字符,并以正确的方式找出CRC值? 可能是我错过了这个。 它适用于.txt和所有其他文件,但它会在.tar, .tar.gz类型文件中产生问题。 因为这里我有一个文件,它是890 MB ,它的名字是file.tar.gz ,它需要203 file.tar.gz ,我有其他文件,它是382 MB ,它的名字是file2.tar它取6097850.000000 Microseconds对我来说难以置信如何可能? 我的问题是这些 1 Some thing problem in my CRC code ? 2 Problem in reading file data style, may be i am reading file data in wrong manner for .tar.gz. 这是我的代码: int CRC16(const char* filePath) { […]

函数返回无穷大的字符串导致嵌入式编译器

我正在尝试执行字符串到双重转换。 在gnu c编译器中我得到了正确的值。 但是如果我在我的嵌入式编译器(renesas CS +)中使用它,它会给出未定义的行为,比如返回无穷大的结果。 这是我的代码: double str_to_double_func(char a[]) { char str[30] = {‘0′}; int loop ; double result; int len ; int pos,n; for(loop = 0;a[loop]!=’\0’;loop++) { str[loop] = a[loop]; } str[loop] = ‘\0’; pos = 0; len = sizeof(str)-1; for (n = 0; n < len; n++) { if (str[n] == '.') […]

由main()修改并由ISR()访问的全局变量

这是我的c代码 char global_variable = 0; ISR(){ PORTA = global_variable; toggle_led;//to make sure that the interrupt is triggered } int main(){ while(1){ _delay_ms(500); gobal_variable++; PORTB = global_variable; } return 0; } 底线是我有一个由main函数修改的全局变量,并由main和ISR – 中断处理程序读取。 当main读取全局变量时,我得到期望的值,但在ISR中,我得到第一次分配给全局变量的值。 我知道这是一个优化问题,但我不明白是什么让编译器看到主要的正确值和ISR中的初始值 注意:当我在ISR中修改变量时,我在ISR中读取它,但在主要中我得到了初始值。

函数的返回值

每个函数调用都在堆栈上执行,并且在函数退出后从堆栈内存中释放该函数。 假设变量“return_value”在函数foo()中声明为非静态(normal unsigned int)。 在函数foo()的末尾,该值返回为 return return_value 该值应该已从堆栈内存中释放。 因此,接收此返回值的main函数如何获得foo()返回的正确值?

将浮点数和整数转换为char *

我是C的新手,并且用C来进入这个嵌入式处理世界。我需要转换为char*并将输出整数和浮点数(仅0.01分辨率)输出到具有8位接口的LCD屏幕。 我一直在阅读一些post,我看到所有这些将int和float转换为char*好主意但我不确定它们中发生了什么。 有人可以为我的两个查询提供一种方法并做一点解释吗?

与arm微控制器串行通信

我试图通过usb从arm cortrx m4微控制器发送数据到pc。 在codeblocks ide中有一个用C ++语言编写的程序。 基本上,程序使用ReadFile函数设置串行通信设置和读取数据。 问题是即使pc proogram和微控制器中的波特率相同,我在输出端也会得到垃圾值。 我怎么解决这个问题? 电脑程序如下所示。 #include #include int main(void) { HANDLE hComm; // Handle to the Serial port char ComPortName[] = “\\\\.\\COM51”; // Name of the Serial port to be opened, BOOL Status; // Status of the various operations DWORD dwEventMask; // Event mask to trigger char TempChar; // […]

同步ISR访问是否需要易失性?

在下面的代码片段中,中断例程使用许多数组中的一个来执行它。 使用的数组是同步选择的, 而不是异步的 (在ISR执行时它永远不会改变)。 在单核微控制器上(如果架构很重要,这个问题假定为STM32L496), foo声明中是否需要volatile指令器? int a[] = {1, 2, 3}; int b[] = {4, 5, 6}; int * foo; //int * volatile foo? int volatile * volatile foo? main(){ disable_interrupt(); foo = a; enable_interrupt(); … disable_interrupt(); foo = b; enable_interrupt(); } void interrupt(){ //Use foo } 我的假设是不需要volatile说明符,因为foo值的任何缓存都是正确的。 编辑: 为了澄清,最后的答案是需要volatile或其他同步,因为否则可以省略或重新排序对foo写入。 缓存不是唯一的问题。

计算使用sleep()时的执行时间

我正在尝试从beagle骨中的ADC读取数据,运行Angstrom linux发行版。 我需要使用像sleep()这样的延迟机制,只在特定时间读取样本,以帮助符合特定的采样率。 我还需要计算执行时间。 这是一个示例POC(概念certificate),以certificate我面临的问题: #include #include #include int main() { clock_t begin, end; while(1) { begin = clock(); sleep(1); // delay for 1 sec end = clock(); printf(“Execution time = %f\n”,((float)(end-begin)/CLOCKS_PER_SEC)); } } 我总是把执行时间设为0.0; 为什么我的结果不是1? 我的猜测是调用sleep()会抢占我的程序,但我不确定。 我还有什么其他选择来计算执行时间,包括延迟?

I2C不与PCA9685一起使用

我正在使用Atmega168我试图在我的PCA9685伺服驱动程序中使用I2C。 我正在使用这个I2C库: https : //github.com/g4lvanix/I2C-master-lib 我正在尝试使用PCA9685(地址:0x41)启动I2C连接。 由于某种原因,I2C库反弹错误,因为没有发送应答位。 这有什么不对? 我的SDA和SCL引脚连接到10k上拉电阻,它们正确连接到PCA9685。 但它仍然没有用。 它可能是我的PCA9685芯片吗? 我也知道地址是0x41,因为我手动桥接了一个地址连接以分配该地址。 这是我的代码: #include #include #include #include #include “i2c.h” #define SERVO_MIN 1000 #define SERVO_MAX 2000 #define SERVO_MID 1500 #define PCA9685_ADDR 0x40 #define PCA9685_MODE1 0x0 #define LED0_ON_L 0x6 #define LED0_ON_H 0x7 #define LED0_OFF_L 0x8 #define LED0_OFF_H 0x9 #define LED PB0 #define LED_DDR DDRB #define LED_PORT PORTB […]