问题标签 [flash-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
517 浏览

arm - 执行预加载在闪存 NOR 中的代码

我正在构建一个在 NXP LPC2478 上运行的 uClinux 系统。该芯片具有 512k 板载快速闪存,可以直接执行代码。我想从常规的外部 SDRAM 加载和运行用户应用程序。但是我有一个特殊的图形库,我想预先加载它以在板载闪存之外执行。

有没有办法编译图形库以在内存中的固定位置(闪存)运行,然后编译/链接使用它的应用程序以将其对该库的所有引用固定到闪存中的适当位置?

如果我必须编写一个手动进行修复的自定义应用程序加载器,我会这样做。

0 投票
3 回答
6649 浏览

filesystems - 什么是嵌入式 NAND 驱动器的好文件系统?

我正在开发一个使用 NAND 闪存进行存储的嵌入式应用程序。现在看来,我们不会使用 Linux 或任何其他 RTOS。应用程序必须处理意外断电。

我们一直在寻找不同的文件系统解决方案,包括 YAFFS2、JFFS2、FAT+FTL 以及来自HCC Embedded的解决方案。

我听说 FAT+FTL 是一个正常的选择,但我担心在意外断电和性能的情况下会丢失数据。如果有人能分享这方面的见解和经验,将不胜感激

0 投票
5 回答
2396 浏览

usb - 删除 FAT32 USB 上的文件会更改第一个簇信息

我制作了一个文件恢复软件,它读取 FAT32 目录条目并识别文件的第一个簇并尝试恢复数据,它应该可以正常工作,但是当我尝试使用 fat32 USB 磁盘时,会发生以下情况。

未删除时分配给文件的簇编号与删除后立即分配给文件的簇编号不同。我使用 Disk Investigator 和 Tune Up Undelete 来验证这一点,他们都无法恢复文件。常见的问题是,通常在删除文件名时,第一个字符会更改为 0xE5,其余字符保持不变,但这也改变了它的集群信息。

有什么帮助吗?你能试试你的 FAT32 USB 并告诉我发生了什么吗?

我的操作系统是 Windows Vista,笔式驱动器是单分区 FAT32。

0 投票
2 回答
341 浏览

hardware - 确定便携式闪存上的故障扇区

我正在尝试编写一个程序来检测便携式闪存设备(拇指驱动器等)的故障迹象。

过去我见过能够检测传统机械硬盘驱动器上的故障扇区和其他类型故障的工具,但我担心闪存由于内部原因而无法对硬件进行相同类型的可预测低级访问存储的工作原理。诸如磨损均衡和其他块重新映射技术(跳过“死”扇区?)之类的东西让我相信,如果不是不可能的话,确定闪存驱动器是否出现故障充其量是困难的(除非经常出现读取故障和设备卸载)。

闪存驱动器在其生命周期结束时应该很容易检测(在读取和全面故障期间不断出现 CRC 差异)。但是那些可能会提前出现故障的驱动器呢?是否有任何迹象,例如吞吐速度较慢,可能表明闪存驱动器将比正常情况更快地发生故障?

沿着检测潜在坏块的思路,我曾考虑尝试随机读取/写入接近或恰好等于整个卷大小的文件,但即便如此,驱动器可能会报告其最大容量以下的大小以占“死”块?

简而言之,是否有任何方法可以规避或至少检测(算法或其他方式)对闪存使用块重映射或其他寿命延长技术?

让我通过表达我对这是否属于 serverfault.com 的不确定性来结束这个问题。这绝对是一个与硬件相关的问题,但我也想要一个软件解决方案——最好是我可以自己编程的解决方案。如果这个问题放错了地方,我很乐意将它迁移到 serverfault -但我确实需要一个编程解决方案。如果您需要澄清,请告诉我:)

谢谢!

0 投票
3 回答
5964 浏览

avr - 我的 AVR 闪存是否因太大的程序而溢出?

我有一个项目,其中一个 ATtiny2313V 正在控制一个 7x5 LED 矩阵来显示滚动文本。为了显示文本,我构建了一个字体,它与程序的其余部分一起存储在闪存中。

整个程序,包括整个字体,占用了 1106 个字节。但是当我将它加载到芯片中时,它似乎没有运行;相反,它只是点亮了几个 LED,仅此而已。

但是,当我删除大部分字体并仅使用字母 A 到 J 进行编译时,程序大小为 878 字节,并且运行良好。

这是因为 AVR 闪存的某种溢出吗?

ATtiny2313V 的数据表说它有 2KByte 的闪存!1106字节怎么会太多呢?

更新:为了清楚起见,我使用的工具链是 AVR Studio(用于编译代码),然后 AVRDude 将其上传到微控制器。据我所知,AVR Studio 使用一个版本的 avr-gcc 来编译代码。

0 投票
5 回答
5459 浏览

embedded - Flash 中的循环缓冲区

我需要将不同长度的项目存储在闪存芯片的循环队列中。每个项目都有它的封装,所以我可以弄清楚它有多大以及下一个项目从哪里开始。当缓冲区中有足够的项目时,它将换行到开头。

将循环队列存储在闪存芯片中的好方法是什么?

我想存储数以万计的物品的可能性。所以从头开始读取到缓冲区的末尾并不理想,因为搜索到末尾需要时间。

另外,因为它是循环的,我需要能够区分第一个项目和最后一个项目。

最后一个问题是它存储在闪存中,因此擦除每个块既耗时又只能为每个块执行一定次数。

0 投票
6 回答
333 浏览

c - 警报历史堆栈或队列?

我正在尝试开发一种警报历史结构以存储在非易失性闪存中。闪存的写入周期数有限,因此我需要一种方法来将记录添加到结构中,而无需每次都重写结构中的所有闪存页面或写出指向队列头/尾的更新指针。

此外,一旦使用了可用的闪存空间,我想开始覆盖以前存储在闪存中的记录,从添加的第一条记录开始,先进先出。这让我认为循环缓冲区最适合添加项目。但是,在查看记录时,我希望结构像堆栈一样工作。例如,记录将按时间倒序显示,后进先出。

除非将它们存储在记录本身中,否则无法存储结构大小、头、尾、索引,因为如果每次将它们写出到固定位置,它将超过存储它们的页面上的最大写入周期。

那么我应该使用堆栈、队列还是某种混合结构?我应该如何将头部,尾部,大小信息存储在闪存中,以便在上电后可以重新初始化?

0 投票
2 回答
445 浏览

embedded - 将 45DB161 数据闪存与 89LP4052 控制器连接

我正在尝试将数据闪存与 89lp 4052 控制器连接。水晶使用 11.0592 兆赫。该控制器内置 spi 总线。我尝试了 CPHA 和 CPOL 的所有组合。尝试了模式 0 和模式 3。无法读取状态寄存器。有时它会读取寄存器,但有时它只是从闪存中取出代码。

我的代码如下。

;;================================================== ===============================

WRITE_FLASH: MOV 20H,#0D7H ;COMMAND LCALL SEND_CLOCK_ONE LCALL READ_FLASH CLR SCON.1 MOV A,21H MOV SBUF,A JNB SCON.1,$ CLR SCON.1 ;;============= ==================================================== ======== SETB CS CLR SCLK LCALL DELAY2 CLR CS ; 再次选择 MOV 20H,#84H LCALL SEND_CLOCK MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#33H LCALL SEND_CLOCK LCALL DELAY2 SETB CS LCALL DELAY2 CLR SCLK CLR CS ;再次选择 MOV 20H,#0D4H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL
SEND_C ,#00H LCALL SEND_CLOCK_ONE

;;================================================== ======================= SEND_CLOCK_ONE: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C, 05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND_LAST RET ;;===================================== ======================================= READ_FLASH: LCALL PULSE_SEND MOV C,DIN MOV 0FH,C LCALL PULSE_SEND MOV C,DIN MOV 0EH,C LCALL PULSE_SEND MOV C,DIN MOV 0DH,C LCALL PULSE_SEND MOV C,DIN MOV 0CH,C LCALL PULSE_SEND MOV C,DIN MOV 0BH,C LCALL PULSE_SEND MOV C,DIN MOV 0AH,C LCALL PULSE_SEND MOV C,DIN MOV 09H,C LCALL PULSE_SEND MOV C,DIN MOV 08H,C LCALL PULSE_SEND RET ;;================================== ====================================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================== ================================ SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================== ================================ SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;============================================= =========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;============================================= =========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND RET

;;================================================== =========================== DELAY2: mov 56H,#0FFH DJNZ 56H,$ mov 56H,#0FFH DJNZ 56H,$ RET ;; ==================================================== ================= PULSE_SEND: SETB SCLK LCALL DELAY2 CLR SCLK LCALL DELAY2 RET ;;==================== ================================ PULSE_SEND_LAST: SETB SCLK LCALL DELAY2 RET ;;========== ============================================ PULSE_READ_FIRST:CLR SCLK LCALL DELAY2 SETB SCLK LCALL DELAY2 RET ;;============================================= ================

结尾

0 投票
5 回答
23763 浏览

c - 我什么时候使用 xdata?

我是嵌入式系统编程的新手。我正在开发使用 8051 芯片组的设备。我在示例程序中注意到,在定义变量时,有时它们使用关键字 xdata。像这样...

静态无符号字符 xdata PatternSize;

而其他时候 xdata 关键字被省略。

我的理解是 xdata 关键字指示编译器将该变量存储在外部、闪存、内存中。

在什么情况下我应该使用 xdata 在外部存储变量?访问这些变量需要更长的时间,对吧?使用 xdata 存储的值在设备硬重置后不会保留,是吗?

另外,我知道 static 关键字意味着该变量将在每次调用它定义的函数时保持不变。 static 和 xdata 必须一起使用吗?

0 投票
3 回答
110 浏览

linux - 是否加载了操作系统级别的闪存驱动程序?

是否有操作系统级别(linux)的闪存驱动程序要加载或者我们需要编写/开发?请建议我。