recan
recan
http://yyds.recan-li.cn 【一个专注于嵌入式软件架构设计的新生代农名工】

注册于 8 months ago

回答
433
文章
10
关注者
14

目前看到的FINSH的实现是一个常驻的线程,不会退出的:

image.png

image.png

可以考虑自己实现一个logout命令,里面设置一个标记位,finsh_thread_entry线程判断标记位,
决定是否退出FINSH。

我记得在这里问题帖子上有人提过
这个 应该限定在内核中使用rt_前缀的,其他都用标准的就好了。
可以参考下。
image.png

应该头文件未包含,加入头文件试试看:

#include   <sys/errno.h>  //对应Exxx之类的宏定义
#include <sys/ioctl.h> //对应FIONBIO

参考下:头文件包含

方便贴一下你的qemu.sh?
qemu-system-arm只只支持-show-cursor选项,没有-show-curse选项:

/usr/bin$ qemu-system-arm -h | grep show
-audio-help     show -audiodev equivalent of the currently specified audio settings
-show-cursor    show cursor

顺带查一下你的qemu-system-arm的版本号:

/usr/bin$ qemu-system-arm -version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.17)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

map文件中找下pc寄存器和lr寄存器的地址对应的代码片段,重点走查下。
如果多次发送相同的数据就出现异常了,可以关注下是不是有内存泄漏的可能?
每次pushlish数据之后,查看下系统的内存情况,观测下是不是线性下降?
log的最后已经提示了mqtt0线程出的问题,优先看这个线程的问题,再考虑是不是别的线程踩内存了?

如果是使用scons编译的话,使用scons --verbose
然后把所有的输出都贴出来,有利于定位问题,目前提供的信息太少了。

我之前也发现了这个问题😱
我一直也很疑问这个本月究竟是自然月,还是最近30天当做一个月
如果单从排行的情况来看,我感觉最近30天这种会合理些,表示动态刷新排行榜。

看了下SAL的配置项,它的使能,只要RT_USING_NETDEVRT_USING_SYSTEM_WORKQUEUE
RT_USING_SAL就自动使能,所以如果想关闭它,还得找到另外两个。
image.png

image.png

可以参考这里,配置下系统时钟和时钟的中断处理:
image.png

双12快来了,买买买!

哈哈哈,不过要看你想学习RT-Thread的哪一块了?
如果仅仅是内核部分,对我而言,bsp/qemu-vexpress-a9就足够了。
但如果你想学习一些外设,做些有趣的项目,倒是可以一试。
外设的话,从接口来说,万变不离其宗,掌握核心的底层协议就好;
至于应用层的数据协议,千变万化,一时间很难学得来那么多。

再补充个关于Alios Things这块,目前我公司的项目正在基于这个来搞,也在生产设计自己的模组,
主要它的使用场景是物联网这块,一般都是通讯模组,类似Wi-Fi模组这种来移植这个操作系统,
而我看到你列的这个板子,它其实是STM32L496的主控,再加了一个Wi-Fi模组(不只是哪家厂家的,可能又是esp8266)。
image.png

如果是主控+Wi-Fi模块这种的话,我是不建议直接用移植Alios Things,毕竟stm32移植Alios Things不是主流的玩法。

防止读出一般我们认为是不可能做到的
之前有做过金融POS机固件开发,涉及到固件安全(安全认证)这块,就算使用硬件安全加密芯片,也没法阻止别人读出你的flash内容来。
但是如何保证你的固件安全呢?
有两个方面:
1.固件不可篡改性:固件是明文的,就算你读可以读出来,但是你不能烧录你的代码进去,跑你的代码逻辑;这里用到的方法就是固件签名验签机制;需要芯片的efuse配合进行;
2.固件密文模式:这种就需要安全芯片来支持了,在这种机制下,只能在芯片中以特定的方式去操作读,才能读出明文的内容,然后写数据的时候,芯片自动就会加密数据;总的来算,就是读的时候自动解密,写的时候自动加密;这种方式,外面的机器一样可以读出你的固件内容来,但是它无法还原明文内容,因为是密文的,它拿不到解密的密钥。

涉及到固件安全这一块,知识还是挺多的,有兴趣一起交流交流。
有个观点,安全是相对的

有个方法,你可以一试;以下是在linux下操作,以mmu.o为例:

bsp/qemu-vexpress-a9$ find . -name mmu.o              
./build/kernel/libcpu/arm/cortex-a/mmu.o
bsp/qemu-vexpress-a9$ cat rtthread.map | grep -n mmu.o
296: .data          0x00000000        0x0 build/kernel/libcpu/arm/cortex-a/mmu.o
1185:LOAD build/kernel/libcpu/arm/cortex-a/mmu.o
1601: .text          0x60021e20      0x590 build/kernel/libcpu/arm/cortex-a/mmu.o
3166: .rodata        0x6009190c      0x104 build/kernel/libcpu/arm/cortex-a/mmu.o
3557: .bss           0x600a4000     0x4000 build/kernel/libcpu/arm/cortex-a/mmu.o
3737: .comment       0x0000006e       0x6f build/kernel/libcpu/arm/cortex-a/mmu.o
3890:                0x00000485       0x2f build/kernel/libcpu/arm/cortex-a/mmu.o

简单来说,就是在map文件里面看mmu.o最终用的是哪个mmu.o
另外一个疑问,你删除了除bsp以外的其他目录后,你执行了clean(scons -c)再重新编译吗?

针对你的这个疑问:
其实这样子也行,就是app获取不了boot的,boot获取不了APP的
换个思路:
提供一个字符串数组存储你的bootloader版本号,再提供一个字符串数组存储你的app版本号,
然后采用指定这两个数组放在特定地址上这种方式,指定存放的flash地址,
具体的操作方法可以参考这个帖子
有了固定的地址就好办了,bootloader里面直接根据app存放版本号的固定地址读取app的版本号;反之亦然。
仅供参考。

关于RTT的线程执行函数,可以先参考下这个文档
我猜测你遇到肯定是第一种情形,即:

void thread_entry(void* paramenter)
{
    while (1)
    {
    /* 等待事件的发生 */

    /* 对事件进行服务、进行处理 */
    }
}

如果是这种情况,那么你想要退出线程的执行,你可以在while(1)中的1里做文章,比如使用一个bool变量代替这个1,类似这样:

rt_bool thread_running = true;
void thread_entry(void* paramenter)
{
    while (thread_running)
    {
    /* 等待事件的发生 */

    /* 对事件进行服务、进行处理 */
    }
}

然后你可以使用MSH_CMD_EXPORT导出一个命令,这个命令,只需要把thread_running = false即可。
这种做法,很多Java代码就是这么玩的。
当然这里有个前提是,你的线程的执行代码没有在一些阻塞接口上死等,比如等待互斥锁或者信号量这种就不行;还是有它的局限性。
仅做为一种思路参考,希望对你有所启发。

查看kconfig配置文件components/libc/Kconfig
可以看到:
image.png
也就是说打开了这个宏,那么系统就可以支持dlopen、dlclose接口去操作动态库(so);
这种dlopen操作在linux下编程是一种很常见的操作,可以参考下:linux使用范例
因为我没在rt-thread上使用过这个dlopen,仅凭经验来了解,仅供参考。

回到
顶部

发布
问题

投诉
建议