我正在编写一个Android应用程序,它将数据每秒写入文件几次,整个文件大小约为1MB,此文件被删除后,新文件启动.我是否应该担心电话的闪存耗尽,导致其失败?你知道Android是否将写入分配到不同的扇区以最小化闪存降级,即使应用程序写入连续文件?日志系统是否以类似的方式工作?换句话说,如果我记录很多(每秒几条记录),会影响手机的闪存资源吗?
我正试图用C语言中的Linux MTD驱动程序擦除NOR闪存......
我对来自ioctl(MEMUNLOCK)调用的返回状态感到困惑,即使ioctl(MEMERASE)在它之后成功也会返回错误.
以下代码显示警告消息但有效(即Flash块已被删除):
int erase_MTD_Pages(int fd, size_t size, off_t offset)
{
mtd_info_t mtd_info;
erase_info_t ei;
ioctl(fd, MEMGETINFO, &mtd_info);
ei.length = mtd_info.erasesize;
for(ei.start = offset; ei.start < (offset+size); ei.start += mtd_info.erasesize) {
if(ioctl(fd, MEMUNLOCK, &ei) < 0)
{
// logPrintf(FAILURE, "[Flash] Can not unlock MTD (MEMUNLOCK, errno=%d)!\n", errno);
// return RETURN_FILE_ERROR;
logPrintf(WARNING, "[Flash] Can not unlock MTD (MEMUNLOCK, errno=%d)!\n", errno);
}
if(ioctl(fd, MEMERASE, &ei) < 0)
{
logPrintf(FAILURE, "[Flash] Can not erase MTD (MEMERASE, errno=%d)!\n", errno); …Run Code Online (Sandbox Code Playgroud) 所以擦除后我不能直接写入内部闪存.如果在写操作之前没有擦除操作,那么我可以.任何想法为什么?
编程功能返回"成功写入"值,但在查看内存时,不会写入任何数据.这是代码:
uint32_t pageAddress = 0x08008000;
uint16_t buffer = 0xAAAA;
HAL_FLASH_Unlock();
FLASH_PageErase(pageAddress);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer);
HAL_FLASH_Lock();
Run Code Online (Sandbox Code Playgroud)
我已经尝试在擦除和编程之间锁定内存,在这些操作之间创建延迟,这没有帮助.
我想知道“flush”和“flash”是什么意思以及它们之间的区别。
我正在尝试开发一种报警历史结构,以存储在非易失性闪存中.Flash存储器写入周期的数量有限,所以我需要一种方法来记录添加到结构,而不每次都重写所有的闪存页的结构或写出更新的指针队列的头/尾.
此外,一旦使用了可用的闪存空间,我想开始覆盖先前存储在闪存中的记录,首先是先加先出的第一条记录.这让我觉得循环缓冲区最适合添加项目.但是,在查看记录时,我希望结构像堆栈一样工作.例如,记录将按照倒序时间顺序显示后进先出.
结构尺寸,头,尾,指标不能储存,除非它们被存储在记录本身,因为如果他们每次都写入到一个固定的位置,这将超过它们存储在网页上的最大写入周期.
那么我应该使用堆栈,队列还是某种混合结构?如何在闪存中存储磁头,尾部,尺寸信息,以便在上电后重新初始化?
我们在基于DM365的定制板中使用MT29F8G08ABABA.我们正在使用NAND启动.RootFS采用UBIFS格式,
以下是NAND的基本架构.

我使用以下命令来创建ubifs,
$(UBIFS_PATH)/mkfs.ubifs -r $(TARGET_FS) -m 4096 -e 520192 -c 75 -o ubifs.img
$(UBIFS_PATH)/ubinize -o $(SYSTEM_CFG)_$(HARDWARE_CFG)_ubifs -m 4096 -p 512KiB $(HARDWARE_CFG)_ubinize.cfg
Run Code Online (Sandbox Code Playgroud)
dm368_ubinize.cfg内容如下,
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=37888KiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令将这些ubifs放到NAND中,
loady 0x82000000 ---> ubifs is loaded to RAM
nand scrub 0x1800000 0x2800000
nand erase 0x1800000 0x2800000
nand write 0x82000000 0x1800000 0x2800000
Run Code Online (Sandbox Code Playgroud)
当我启动内核时,从内核检测到UBIFS时出错,
下面是相同的内核日志,
[ 0.000000] Linux version 2.6[ 0.000000] Linux version 2.6.37_IPNC_DM368_5.1.0 (still-image@stillimage-VirtualBox) (gcc version 4.3.3 (GCC) ) #1 PREEMPT Sat Jan 4 11:09:29 IST 2014
[ 0.000000] …Run Code Online (Sandbox Code Playgroud) 我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我用过stm32f4xx_hal_flash.c图书馆。我首先使用以下代码擦除扇区:
void Flash_Init(void)
{
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = FLASH_BANK_1;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_10;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
if(HAL_FLASH_Unlock() == HAL_OK)
{
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
HAL_FLASHEx_Erase(&pEraseInit,0);
HAL_FLASH_Lock();
}
}
Run Code Online (Sandbox Code Playgroud)
程序在到达HAL_FLASHEx_Erase(&pEraseInit,0);函数时挂起。我的分散文件如下所示:
LR_IROM1 0x08000000 0x01000000 { ; load region size_region
ER_IROM1 0x08000000 0x01000000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data …Run Code Online (Sandbox Code Playgroud) 我想将一些文本写入 Arduino ESP32 的闪存中。它有点工作,但不是我想要的。
void writeString(const char* toStore, int startAddr) {
int i = 0;
for (; i < LENGTH(toStore); i++) {
EEPROM.write(startAddr + i, toStore[i]);
}
EEPROM.write(startAddr + i, '\0');
EEPROM.commit();
}
Run Code Online (Sandbox Code Playgroud)
我的电话
writeString("TEST_STRING_TO_WRITE", 0);
Run Code Online (Sandbox Code Playgroud)
只将 TEST 写入内存。我不懂为什么。是因为_吗?或者我错过了一些不同的东西?
这是使用的 LENGTH 宏
#define LENGTH(x) (sizeof(x)/sizeof(x[0]))
Run Code Online (Sandbox Code Playgroud)
以及我用来再次从内存中读取字符串的方法(似乎工作正常):
String readStringFromFlash(int startAddr) {
char in[128];
char curIn;
int i = 0;
curIn = EEPROM.read(startAddr);
for (; i < 128; i++) {
curIn = EEPROM.read(startAddr + i);
in[i] = curIn;
}
return String(in);
}
Run Code Online (Sandbox Code Playgroud) 最近经常使用闪存 ROM,我发现在芯片的内部闪存以及外部 SPI 闪存设备中,扇区的大小通常都是这样的:
我很好奇为什么起始地址空间的扇区比后面的地址小。我怀疑使用引导加载程序之类的东西会更方便。由于引导加载程序通常小于 128k,因此这将允许引导加载程序写入前 2 或 3 个扇区。这使得主空间应用程序有更多的扩展空间,因为要对其进行编程,我们需要从新扇区的开头开始。如果我们只有 128k 大小的扇区,那么我们基本上就会浪费128k - bootloader_size空间。
我的怀疑正确吗?或者这样做还有其他原因吗?真的很想知道这里的设计决策是什么。
我正在尝试写入STM32F1xxC的内部闪存(每页2KB),我可以在页面擦除后写入闪存,将该页面的每个字节转换为0xFF.
很奇怪我不能写两次相同的flash地址,只有当该地址的前一个值是" 0xFFFF " 时才有可能.
这种限制的原因是什么?而且我想知道为什么我不能写到奇数地址?(例如0x803F0A1)
我不认为我的问题是平台(或供应商)特定的,所以我不添加任何代码.
我感谢任何帮助.