aozima
aozima
拒绝白嫖,拒绝键盘侠!多思考,多发分析整理过的文字,别只乱贴代码或截图就不管了。

注册于 12 years ago

回答
825
文章
4
关注者
36

以FAT文件系统为例,当文件创建并写入数据后,这个数据就在固定的位置了。

然后我们对文件中数据修改10000次,但没有增大文件体积。这个固定位置就被写入了10000次。
而带有擦写均衡特性的文件系统,即使你修改文件原有数据,而不改变文件大小,他也可能每次写入在新的位置上。

基于上面的原理,当你新的数据写入1半掉电了,此时你的原有数据没有任何损失,那么再次上电能看到你写入前的状态,这就是掉电保护。而如果你用FAT,那再启动整个文件系统可能崩溃,特别是写关键数据时。
当然FAT有也有一点点考虑,如双FAT表,但反正效果一般。

以上仅是简单的原理说明,实际的实现中要复杂得多。
当然,即使有这些特性,你依然可以在硬件上增加RAM缓冲和额外的电池。

关中断最稳妥,如us级的IO时序模拟。

ms级的可以用优先级,或是调度锁解决。

不同数据类型有不同的对齐属性,因此地址有对应的对齐要求,也有对应的访问指令。
double要求8字节对齐,会使用LDM/STM多字指令来访问。

你强转当然可能会出问题,你检查regLoad的类型和地址可以确认。

准备工作

  • 下载 RT-Thread 源码,推荐下载3.1.0及以上版本。

需要使用比较老的版本
https://gitee.com/rtthread/rt-thread/tree/lts-v3.1.x/

用Deepin,那编译应该是GCC了,检查下检查脚本的text中,是否有

        /* section information for initialization */
        . = ALIGN(4);
        __rt_init_start = .;
        KEEP(*(SORT(.rti_fn*)))
        __rt_init_end = .;

没有的话,就有可能被链接器自动丢弃了,你可以通过map文件确认这点。

\r 回车,但不换行。然后刷一整行,简单粗暴,就是输出有些多,可能影响性能。
另外可以用控制命令让光标左移,然后依次输出-/|\让字符转动起来,然后再输出一个百分比也行。

把MSP回复到初始值,以回收一些已push,但再也不会pop的栈。

M0上面不可用,M0+及以上可以: M0没有SCB_VTOR 不能通过此寄存器恢复MSP

没往download分区写入新固件,就会打印这个。
无视即可!

直接去那个后面问啊,那个代码不是改了一下就很稳了嘛,所以那就是稳定的IO模拟SPI。

栈溢出99%,请不要把256个字节的缓冲区开在线程里面,可以改为malloc或是全局。
或把你的线程栈增加这256字节的空间。

就当成普通的Hardfault查就行了,
根据位置,一下就能定位谁在访问非法地址。

参考这个: 求助 mbedtls 验证 CA 证书的问题
测试期间不校验证书是可以屏蔽的,产品中为了安全,需要RTC来确认时间。
所以要校验证书,还得先校时。

这时APP应用的b也的值也成了10,而不是一般情况下的0

这是你调试看到的,还是你猜的?
如果是真的,请找出问题; 如果是猜的,下次可以先验证后再做结论。

末赋值的全局变量,在GCC中叫BSS,在启动代码中会对其做清0动作。(其它编译器都有类似处理)
所以你在boot中用了全局变量a在0x20000004,
然后在APP中全局变量的b也在0x20000004的地址,他会由APP的启动代码中清为0。
如果不为0,说明你APP的启动代码没能正确清0掉BSS,此时即使不用BOOT也是会有问题的。

回到
顶部

发布
问题

投诉
建议