Tag: embedded

Nordic SDK打印到串口

我有一个运行在Nordic SDK上的Arduino设备(它是Red Bear Lab BLE nano)。 我希望能够在GTKTerm中进行串行打印,以便能够调试我的代码中发生的事情。 为此,我有以下代码: /* * Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved. * * The information contained herein is confidential property of Nordic Semiconductor. The use, * copying, transfer or disclosure of such information is prohibited except by express written * agreement with Nordic Semiconductor. * */ /** * […]

是否可以在运行时在M0 +上设置ISR处理程序

我的SAMD21 ARM M0 +有一个“默认”resetVectors.c文件。 它有一些看起来像: __attribute__ ((section(“.vectors”))) const DeviceVectors exception_table = { … }; 在其中定义不同的处理程序存根的位置。 出于测试目的,我想使用其中一个未使用的外设IRQ。 默认情况下,未使用的设置为NULL地址。 我已向自己certificate我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序。 但是,是否可以在编译时间之外完成此操作? 我观察到该表似乎是基于偏移0.所以我尝试了这个: DeviceVectors *table = 0x0000000; table->pvReserved21 = PV21Handler; 但这只是挂板。 是否有动态方式在运行时分配处理程序?

对于任何类型的文件,哪种数据类型更适合计算CRC16

这里我使用两个不同的函数来计算任何类型文件(.txt,.tar,.tar.gz,.bin,.scr,.sh etc) CRC16,不同的大小也从1 KB to 5 GB不等。 我想实现这一目标 `cross platform less time consuming Have to work proper for any type of file and any size` 我在两个函数中都获得了相同的CRC值。 但任何人都可以告诉我哪个更好的计算任何类型的文件在不同的不同平台上的任何类型的文件CRC16。 这里我们要考虑0到255所有类型的字符。 任何人都可以建议我哪一个符合我的要求。 两种function的代码: 第一个在readChar有int数据类型的我在这里使用int readChar int CRC16_int(const char* filePath) { //Declare variable to store CRC result. unsigned short result; //Declare loop variables. int intInnerLoopIndex; result = 0xffff; //initialize […]

snprintf()使用newlib nano打印垃圾浮动

我正在运行带有ARM Cortex-M3(STM32F205)的裸机嵌入式系统。 当我尝试使用带浮点数的snprintf()时,例如: float f; f = 1.23; snprintf(s, 20, “%5.2f”, f); 我把垃圾变成了垃圾。 格式似乎很荣幸,即垃圾是一个格式良好的字符串,包含数字,小数点和两个尾随数字。 但是,如果我重复snprintf ,字符串可能会在两次调用之间发生变化。 浮点数学似乎在其他方面起作用,而snprintf与整数一起工作,例如: snprintf(s, 20, “%10d”, 1234567); 我将newlib-nano实现与-u _printf_float链接器开关一起使用。 编译器是arm-none-eabi-gcc 。 我确实怀疑内存分配问题,因为整数打印没有任何打嗝,但浮动表现就好像它们在过程中被破坏一样。 printf系列函数使用浮点数调用malloc ,而不是整数。 我在这个上下文中使用的唯一不属于newlib的代码是我的_sbrk() ,它是malloc所必需的。 caddr_t _sbrk(int incr) { extern char _Heap_Begin; // Defined by the linker. extern char _Heap_Limit; // Defined by the linker. static char* current_heap_end; char* current_block_address; […]

-Werror导致编译器在#warning上停止。 我该怎么做才能防止这种情况发生?

首先,我希望它停止警告。 但我也希望打印出一些信息性的消息(比如“回来实现这个!”)。 不幸的是,我的编译器不支持#info #message , #pragma message() , #pragma message()等。 我知道有-Wno-error= ,但我的google-foo很弱,我似乎无法找到#warning的 。 我试过-Wno-error=warning ,只是说“没有 – -Wwarning ”。 与“ warn ”相同。 有什么建议? 值得一提的是,我使用的是Tensilica xtensa编译器,xt-xcc,它似乎是一个gnu派生词,或者至少使用了gnu前端。 它的版本是8.0.0。

C中的数据封装

我目前正在研究一个嵌入式系统,我在电路板上有一个组件,它出现了两次。 我想为组件提供一个.c和一个.h文件。 我有以下代码: typedef struct { uint32_t pin_reset; uint32_t pin_drdy; uint32_t pin_start; volatile avr32_spi_t *spi_module; uint8_t cs_id; } ads1248_options_t; 这些都是硬件设置。 我创建了这个结构的两个实例(每个部分一个)。 现在我需要在后台保留一组值。 例如,我可以每秒从该设备读取值,并且我想保留最后100个值。 我希望这些数据不能从我的组件的“外部”访问(仅通过我的组件中的特殊function)。 我不确定如何在这里继续。 我真的需要将数组作为结构的一部分吗? 我想到的是做以下事情: int32_t *adc_values; // <– Add this to struct int32_t *adc_value_buffer = malloc(sizeof(int32_t) * 100); // <– Call in initialize function, this will never be freed on purpose 然而,我将能够从我的代码中的任何地方(也来自我的组件外部)访问我的int32_t指针,这是我不喜欢的。 […]

未定义引用“仅一些math.h”函数

我有一个奇怪的问题。 数学库已添加到我的makefile中。 # include standard C library LDFLAGS += -lc # include standard math library LDFLAGS += -lm 在输出文件(.map)中,我可以看到所有内容都已正确链接: LOAD c:/gnu/powerpc-eabi/3pp.ronetix.powerpc-eabi/bin/../lib/gcc/powerpc-eabi/4.3.3/nof\libgcc.a LOAD c:/gnu/powerpc-eabi/3pp.ronetix.powerpc-eabi/bin/../lib/gcc/powerpc-eabi/4.3.3/../../../../powerpc-eabi/lib/nof\libc.a LOAD c:/gnu/powerpc-eabi/3pp.ronetix.powerpc-eabi/bin/../lib/gcc/powerpc-eabi/4.3.3/../../../../powerpc-eabi/lib/nof\libm.a 当我做 z = pow((double) 2, (double) 3); 它工作正常。 但如果我测试另一个函数,如: double result = asin(x); 我去拿: undefined reference to `asin’ collect2: ld returned 1 exit status 怎么会这样? math.h中提供了pow和asin ,见下文: /* Non reentrant […]