在嵌入式环境中(使用MSP430),我看到了部分写入非易失性存储器导致的一些数据损坏.这似乎是由写入期间的功率损耗(对FRAM或信息段)造成的.
我正在使用CRC验证存储在这些位置的数据.
我的问题是,防止这种"部分写入"腐败的正确方法是什么?目前,我已修改我的代码以写入两个单独的FRAM位置.因此,如果一个写入被中断导致CRC无效,则另一个位置应保持有效.这是一种常见做法吗?我是否需要为任何非易失性存储器实现这种双写行为?
我有以下C代码:
#define PRR_SCALE 255
...
uint8_t a = 3;
uint8_t b = 4;
uint8_t prr;
prr = (PRR_SCALE * a) / b;
printf("prr: %u\n", prr);
Run Code Online (Sandbox Code Playgroud)
如果我编译它(使用msp430平台编译器,对于一个名为contiki的小型嵌入式操作系统),结果为0,而我预期为191.(uint8_t是typedef'ed为unsigned char)
如果我将其更改为:
uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a) / b;
printf("prr: %u\n", prr);
Run Code Online (Sandbox Code Playgroud)
它正常工作并打印191.
在Ubuntu框中使用gcc编译这个"正常"的简单版本会在两种情况下打印正确的值.
我不确定为什么会这样.我可以通过事先将DEFINEd值赋给变量来绕过它,但我宁愿不这样做.
有谁知道这是为什么?也许有关于此的更多信息的链接?
我希望能够为高端MSP430提供基本操作系统和基本文件系统,可能是MSP430F5438.我知道我可以使用像FreeRTOS,IAR PowerPac或Micrium这样的东西来命名操作系统和文件系统的一些选项.但是我希望能够在后期加载小applet或线程,理想情况下从文件系统中获取这些额外的代码.我的目标是不必重新刷新整个设备以更改或实现嵌入式设备上的功能.不确定在哪里开始实现此功能,或者我是否需要切换到另一个处理器,如ARM.
有没有人尝试在MSP430上使用zlib压缩?您对如何编译到库以便在MSP430项目中使用(我使用的是IAR Embedded Workbench)有什么建议吗?
我需要学习编程MSP430,但还没有实际的芯片.我在Code Composer Studio上尝试的所有配置(快照除外,但它不算数,对吗?)需要USB上的东西.如何在没有芯片的情况下学习芯片编程?
什么是需要USB的仿真器?
假设我们想在地址 say 处写入0xc000,我们可以在 C 中定义一个宏:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))
Run Code Online (Sandbox Code Playgroud)
我的问题是,当使用任何微控制器时,考虑一个例子MSP430,P1OUT寄存器地址是0x0021。
但是当我们使用P1OUT=0xFFFF时;// 它为 P1OUT 分配一个值 0xFFFF。
我的问题是它如何写入该地址,例如在本例中为 0x0021。IDE是IAR。我在头文件 msp430g2553.h 中找到了以下定义:
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
Run Code Online (Sandbox Code Playgroud)
我想它正在定义地址,但是其他要写入或读取的宏在哪里。
谁能解释一下 P1OUT 如何在该特定地址位置写入的流程?另外请告诉我 0x0021u 中的 u 是什么意思?
谢谢
到目前为止我发现的细节是:
在 msp430g2553.h 中
#ifdef __IAR_SYSTEMS_ICC__
#include "in430.h"
#pragma language=extended
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short …Run Code Online (Sandbox Code Playgroud) 我已经使用 IAR 嵌入式工作台很长一段时间了,但仍有一件事我无法理解。这就是断点操作的不一致之处。
我有一个运行 RTOS 的相当大的项目(这可能会影响问题吗?),当我放置断点时,不能保证调试器会在此断点处停止。有时会,有时不会。我发现的解决方法是手动停止处理器并在处理器暂停时放置断点。但即使这样也没有100%的成功率。
我正在生成调试信息并且正在调试模式下运行
有人遇到过类似的问题或者有什么想法吗?
我知道取消引用空指针是未定义的 - 但我想知道在特定目标上发生了什么 - 一个MSP430.
我现在没有一块板可以在我面前加载它来测试它.
如果我这样做(或者类似的话)会发生什么?
int * foo = NULL;
(*foo)++; //Crash?
Run Code Online (Sandbox Code Playgroud)
位置0x0在SFR范围内并保留.
它会产生PUC/POR吗?还是会默默地"工作"?
生成的程序集是
;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15
Run Code Online (Sandbox Code Playgroud)
因此,位置0x0实际上是递增1.
当我在模拟器中运行它时,我看到地址0x0的值从0变为1.我在调试日志中没有警告,程序正常退出.
我正在使用IAR EW430编译器/汇编器/模拟器.
我想为Contiki添加一些第三方库,但目前我不能.所以我想用一个简单的库进行测试.
我在hello.c中写了两个文件hello.c hello.h我有:
printf(" Hello everbody, library call\n");
Run Code Online (Sandbox Code Playgroud)
在hello.h我有:
extern void print_hello();
Run Code Online (Sandbox Code Playgroud)
我使用命令创建了hello.o:
msp430-gcc -mmcu=msp430f1611 hello.c -o hello.o
Run Code Online (Sandbox Code Playgroud)
我创建了一个存档文件:
ar -cvq libhello.a hello.o
Run Code Online (Sandbox Code Playgroud)
我转到contiki,我编写了一个调用hello.h来执行函数的简单程序.我尝试在makefile中使用PROJECT LIBRARIES变量包含hello.a,当我编译时我得到这个:
Hello_lib.sky section .vectors' will not fit in region'vectors'
...
region vectors overflowed by 32 Bytes
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下我的问题是什么(我是该领域的新手)?
如果可能的话如何纠正?(我应该为msp430-gcc指定哪些选项)谢谢.
我正在编写一些代码,这些代码将极大地受益于 C++ 11 中引入的 lambda 的简洁语法。编译器是否支持此功能?
使用 Energia 或 embedXcode 编译时如何指定编译器标志?
msp430 ×10
embedded ×6
c ×4
iar ×3
compression ×1
contiki ×1
embedxcode ×1
gcc ×1
memory ×1
non-volatile ×1
null-pointer ×1
overflow ×1
pointers ×1
rtos ×1
zlib ×1