我正在尝试在 LPCXpresso 上为 LPC1769 创建一个项目。我有一个 C 文件调用
#include <string.h>
int main()
{
//some stuff
strnlen(SomeString, someInt);
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Undefined reference to 'strnlen'
Run Code Online (Sandbox Code Playgroud)
奇怪的是strcpy、strncpy或者其他常用的字符串函数都没有问题。
我正在为 Cortex-M3 处理器构建使用的编译器是:arm-none-eabi-gcc 在 Eclipse 中,我勾选了 MCU 链接器选项:没有启动或默认库我在 Ubuntu 上运行 Eclipse
虽然仅使用 strlen 绕过它可能很容易,但我实际上在使用使用 strnlen 的库时遇到了问题,而且我不想弄乱库源。
我想学习并实现CAN BUS协议.我在软件中使用MSP430 Launchpad实现了UART,SPI,I2C和单线总线协议.现在我想了解CAN总线协议.我有mBed LPC 1768 Cortex M3开发板.mBed有Can Bus Library,但我想编写自己的库,以便我可以详细了解它,即我对其他通信协议的方式.
我无法找到合适的资源开始,这些材料似乎散布在网上.任何人都可以指导如何使用我提供的开发板编写和实现CAN总线协议.
谢谢
我目前正在研究Windows 7上的LPCXpresso(基于eclipse的)工具链中的C程序,这是一个针对NXP Cortex M3微处理器的gcc IDE.它提供了一种通过JTAG对微处理器进行编译链接编程的简单方法.构建的结果是由调试配置加载的AXF文件(ELF格式).
加载的程序驻留在闪存中,从0x00000到0x3FFFB.我想在0x3FFFC处包含一个4字节的CRC-32,以便在启动时验证程序.我添加了另一节,并使用gcc __attribute__指令访问该内存位置.
uint32_t crc32_build __attribute__ ((section(".text_MFlashCRC")));
Run Code Online (Sandbox Code Playgroud)
为了计算和存储CRC-32值,我的计划是使用SRecord以及以下的构建后步骤:
arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"
checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"
../util/srec_cat "${BuildArtifactFileBaseName}.bin" -binary -crop 0 0x3FFFC -fill 0xFF 0x00000 0x3FFFC -crc32-b-e 0x3FFFC -o "${BuildArtifactFileBaseName}.crc.bin" -binary
echo ""
echo "CRC32:"
../util/srec_cat "${BuildArtifactFileBaseName}.crc.bin" -binary -crop 0x3FFFC 0x40000 -o - -hex-dump
Run Code Online (Sandbox Code Playgroud)
这将创建一个带校验和的二进制文件(引导加载程序所必需的),然后在使用的闪存上计算CRC,将CRC值存储在0x3FFFC.
但是,我不认为我可以使用调试器加载二进制文件.有一个内置的编程实用程序与LPCXpresso可以加载修改后的二进制文件,但是,这不允许我调试.我相信我可以尝试使用"仅附加"模式启动与原始AXF文件的调试会话,但这会变得很麻烦.
我已经能够使用readelf来检查crc32_buildAXF文件中的变量.有没有办法在AXF文件中编辑变量?是否有行业标准方法将CRC作为构建后步骤插入?
我在LPC1754,59和68 + FreeRTOS + CMSIS 上运行固件.
我希望能够将微控制器置于最低功耗模式,但是:
据我在" LPC17xx用户手册 "(第58,59页)中所读到的,我应该可以从EINT3唤醒到"断电"模式.
我错过了什么?是否在低功率时产生中断?怎么说?我应该做任何特定的东西才能生成它吗?
编辑:
我无法理解重新映射中断向量或引导块的概念.重映射矢量表有什么用?如何使用重映射和无重映射?有关这方面好文章的链接吗?我用Google搜索,但无法得到好的答案.将RAM映射到0x0000并将0x0000中存在的任何内容映射到其他地方有什么好处?从0x0000执行是否执行速度更快?
我正试图找到一个免费/廉价的RTOS,其他人发现它与恩智浦LPC1788微控制器配合得很好.我原本打算使用FreeRTOS,但它似乎不支持那个特定的处理器; 最接近的支持核心是LPC1768.ThreadX可与LPC1788配合使用,但它的许可证将耗资数千英镑.建议?
编辑1:我忘了提及,我正在使用IAR Embedded Workbench.
编辑2:我想我还应该指出,我对嵌入式编程相当新,更不用说使用RTOS了.FreeRTOS和ThreadX似乎非常相似,都有相当直观的API.另一个RTOS的API与这些API的匹配越多,我想就越好.
编辑3:我一直在寻找一个名为embOS的RTOS.它看起来很专业,API看起来不错,它们支持相当数量的处理器/ IDE组合(包括我的),而且我已经有一个示例项目正常工作.它不是免费的,它的许可证将花费大约2500欧元,但这仍然比threadX许可证便宜约3倍.感谢您的建议,我觉得有点不好,我不能选择一个接受的答案.
我正在尝试一个用于 ARM-C 互操作的简单程序。这是代码:
#include<stdio.h>
#include<stdlib.h>
int Double(int a);
extern int Start(void);
int main(){
int result=0;
printf("in C main\n");
result=Start();
printf("result=%d\n",result);
return 0;
}
int Double(int a)
{
printf("inside double func_argument_value=%d\n",a);
return (a*2);
}
Run Code Online (Sandbox Code Playgroud)
汇编文件如下:
.syntax unified
.cpu cortex-m3
.thumb
.align
.global Start
.global Double
.thumb_func
Start:
mov r10,lr
mov r0,#42
bl Double
mov lr,r10
mov r2,r0
mov pc,lr
Run Code Online (Sandbox Code Playgroud)
在 LPC1769(嵌入式艺术家板)上调试期间,我在指令“ result=Start() ”上收到硬故障错误。我正在尝试在这里进行arm-C网络互连。上述语句(result=Start())执行过程中lr值为0x0000029F,即错误指令所在,pc值为0x0000029E。这就是我在 r1 中得到错误指令的方式
__asm("mrs r0,MSP\n"
"isb\n"
"ldr r1,[r0,#24]\n");
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下我哪里出错了吗?任何解决方案表示赞赏。先感谢您。
我是 cortex-m3 的初学者,正在使用由 Code_Red 提供支持的 NXP LPCXpresso IDE。这是我的代码的反汇编。
IntDefaultHandler:
00000269: …Run Code Online (Sandbox Code Playgroud) 我正在为LPC2148编写自己的驱动程序,我想到了一个问题.如何在UART中收到未指定大小的消息?
想到的唯一两件事是:1 - 配置看门狗并在时间用完时结束接收.2-使它无论何时向其发送消息都必须有消息字符结束.
在我看来,第一选择似乎更好,但我想知道是否有人有更好的答案,我知道必须有.
非常感谢你
我知道很多人在这里抱怨strcpy,但我没有找到任何使用搜索来解决我的问题.
首先,调用strcpy本身不会导致任何类型的崩溃/分段错误.其次,代码包含在一个函数中,第一次调用这个函数它完美地运行.它只在第二次崩溃.
我正在用LPC1788微控制器编程; 内存非常有限,所以我可以看到为什么像malloc这样的东西可能会失败,但不是免费的.
函数trimMessage()包含代码,函数的目的是删除大字符串数组的一部分,如果它变得太大.
void trimMessage()
{
int trimIndex;
// currMessage is a globally declared char array that has already been malloc'd
// and written to.
size_t msgSize = strlen(currMessage);
// Iterate through the array and find the first newline character. Everything
// from the start of the array to this character represents the oldest 'message'
// in the array, to be got rid of.
for(int i=0; i < msgSize; i++)
{
if(currMessage[i] == '\n')
{
trimIndex = i; …Run Code Online (Sandbox Code Playgroud)