请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2711|回复: 22
收起左侧

[ThreadX视频教程] 第5期ThreadX视频教程:单片机动态APP加载MPU玩法,隔离应用和系统,APP死机了系统也不会挂(2022-05-15)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
发表于 2022-5-15 09:50:38 | 显示全部楼层 |阅读模式
本期视频教程为大家带来单片机动态APP玩法高级进阶MPU内存保护。通过MPU和SVC可以隔离应用,APP死机了系统都不会挂掉。

单片机动态APP加载玩法就跟安卓应用似的,可以从SD卡,NAND,NOR,  eMMC等各种地方加载应用程序到支持执行程序的SRAM,SDRAM,QSPI Flash,内部Flash等空间执行。


视频:

https://www.bilibili.com/video/BV1UY4y1r7mu




本次视频主要分为以下几个内容:
1、原理说明(重要核心)。
2、SVC软中断方式访问内核和外设API,进入中断后是特权级模式,可以方便的访问各种内核和外设API。
3、动态APP使能相应外设地址的MPU后也可以访问。
4、几种异常的处理。
5、最后几分钟巨闹心的展示了下C和一批汇编文件之间各种调试跳转仿真问题。

123.png


例子下载:

链接:https://pan.baidu.com/s/1pT0SUw0aAodDHzEv8UtAEw  提取码:hk6f
















回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-15 10:30:48 | 显示全部楼层
更新完毕。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-5-15 10:51:45 | 显示全部楼层
STM32F4有MPU吗?感觉这个STM32F4芯片上是不是无法实现啊
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-5-15 11:56:45 来自手机 | 显示全部楼层
Nordic是不是也是通过SVC方式访问协议栈的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-15 14:21:17 | 显示全部楼层
yklstudent 发表于 2022-5-15 10:51
STM32F4有MPU吗?感觉这个STM32F4芯片上是不是无法实现啊

有的,有8个。

image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-15 14:21:56 | 显示全部楼层
dodo55 发表于 2022-5-15 11:56
Nordic是不是也是通过SVC方式访问协议栈的?

nordic的代码没研究过。
回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-5-15 15:49:29 | 显示全部楼层
硬汉大哥,主程序里面,设置的MPU参数,都不起作用吗?  只有APP的在切换来,切换去的起作用?  那么主程序里面,假设有以太网通信,设置了以太网收发描述符的MPU设置, 那么APP一旦起来了,主程序的都被关闭了, 以太网通信岂不是都失败了? 有点没闹清楚。
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-5-15 23:01:16 | 显示全部楼层
硬汉哥,以前在主程序设置的像SDRAM、以太网这些MPU配置会被动态应用重新配置,是否要在12-15 MPU的备份位置重新设置一下
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
发表于 2022-5-16 07:42:49 来自手机 | 显示全部楼层
工程只有mdk的,请问有没有iar的demo,iar怎样设置才能生产的APP hex与地址无关呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-16 09:48:09 | 显示全部楼层
morning_enr6U 发表于 2022-5-15 15:49
硬汉大哥,主程序里面,设置的MPU参数,都不起作用吗?  只有APP的在切换来,切换去的起作用?  那么主程序 ...

主程序的任务可以暂时挂起。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-16 09:48:22 | 显示全部楼层
feelingcode 发表于 2022-5-15 23:01
硬汉哥,以前在主程序设置的像SDRAM、以太网这些MPU配置会被动态应用重新配置,是否要在12-15 MPU的备份位 ...

要的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-16 09:51:20 | 显示全部楼层
way2888 发表于 2022-5-16 07:42
工程只有mdk的,请问有没有iar的demo,iar怎样设置才能生产的APP hex与地址无关呢?

IAR和GCC的也可以,这里有对应的配置:

https://docs.microsoft.com/en-us ... dx-modules/appendix

回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-5-16 13:40:23 | 显示全部楼层
eric2013 发表于 2022-5-16 09:48
主程序的任务可以暂时挂起。

硬汉大哥,任务切回主程序的时候,  这个MPU的设置,是哪块负责切换回主程序的设置的?  还是需要手动切换?谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-16 13:47:00 | 显示全部楼层
morning_enr6U 发表于 2022-5-16 13:40
硬汉大哥,任务切回主程序的时候,  这个MPU的设置,是哪块负责切换回主程序的设置的?  还是需要手动切 ...

主程序和APP都是在系统调度器下管理的,通过任务做,你仅需挂起主程序的任务,就不往主程序跳转了。
回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-5-16 15:10:08 | 显示全部楼层
感谢硬汉大哥的解答!
回复

使用道具 举报

0

主题

213

回帖

213

积分

高级会员

积分
213
发表于 2022-5-18 18:42:43 | 显示全部楼层
txm_module_manager_object_pool_create 创建的ObjectMemory占用挺大的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-19 06:35:49 | 显示全部楼层
regbbs 发表于 2022-5-18 18:42
txm_module_manager_object_pool_create 创建的ObjectMemory占用挺大的。

这个是我特地开了很大空间,方便使用。

本身需求的大小由用户APP的flash大小和ram大小决定。
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-5-19 10:46:33 | 显示全部楼层
__txm_module_preamble:
    .dc.l      0x4D4F4455                                       // Module ID
    .dc.l      0x6                                              // Module Major Version
    .dc.l      0x1                                              // Module Minor Version
    .dc.l      32                                               // Module Preamble Size in 32-bit words
    .dc.l      0x12345678                                       // Module ID (application defined)
    .dc.l      0x02000007                                       // Module Properties where:
                                                                //   Bits 31-24: Compiler ID
                                                                //           0 -> IAR
                                                                //           1 -> ARM
                                                                //           2 -> GNU
                                                                //   Bits 23-3: Reserved
                                                                //   Bit 2:  0 -> Disable shared/external memory access
                                                                //           1 -> Enable shared/external memory access
                                                                //   Bit 1:  0 -> No MPU protection
                                                                //           1 -> MPU protection (must have user mode selected - bit 0 set)
                                                                //   Bit 0:  0 -> Privileged mode execution
                                                                //           1 -> User mode execution
    .dc.l      _txm_module_thread_shell_entry - . - 0           // Module Shell Entry Point
    .dc.l      demo_module_start - . - 0                        // Module Start Thread Entry Point
    .dc.l      0                                                // Module Stop Thread Entry Point
    .dc.l      1                                                // Module Start/Stop Thread Priority
    .dc.l      1024                                             // Module Start/Stop Thread Stack Size
    .dc.l      _txm_module_callback_request_thread_entry - . - 0 // Module Callback Thread Entry
    .dc.l      1                                                // Module Callback Thread Priority
    .dc.l      1024                                             // Module Callback Thread Stack Size
    .dc.l      __code_size__                                    // Module Code Size
    .dc.l      __data_size__                                    // Module Data Size

硬汉哥,对于红色部分不是很理解,得出这个相对地址,实际加载到一个固定的地址空间(比如:0x90000000)是怎么计算代码偏移的。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-19 11:01:15 | 显示全部楼层
feelingcode 发表于 2022-5-19 10:46
__txm_module_preamble:
    .dc.l      0x4D4F4455                                       // Module ID ...

这个app工程也有map文件的,这里得出的值和map文件分配的位置是一致的,所以只要有了首地址,函数地址就都确定了。
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-5-19 16:14:36 | 显示全部楼层
eric2013 发表于 2022-5-19 11:01
这个app工程也有map文件的,这里得出的值和map文件分配的位置是一致的,所以只要有了首地址,函数地址就 ...

编译时使用了位置无关指令,代码编译时生成一个相对于r9寄存器的偏移量,这个偏移量会在.text段,r9寄存器存储的是首地址,这样函数地址就都确定了,这个理解是否正确
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-20 08:04:18 | 显示全部楼层
feelingcode 发表于 2022-5-19 16:14
编译时使用了位置无关指令,代码编译时生成一个相对于r9寄存器的偏移量,这个偏移量会在.text段,r9寄存 ...

这里将其安排到首地址。

image.png
回复

使用道具 举报

12

主题

187

回帖

223

积分

高级会员

积分
223
发表于 2022-5-21 10:18:44 | 显示全部楼层
不知道有什么好的应用场景,把bootloader单独做成一个APP?
能想到的,就是应用程序比较多的时候,分开成若干个应用程序,用哪个加载哪个,但是感觉这种情况也比较少见。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2022-5-22 09:04:19 | 显示全部楼层
zhang0352505 发表于 2022-5-21 10:18
不知道有什么好的应用场景,把bootloader单独做成一个APP?
能想到的,就是应用程序比较多的时候,分开成 ...

可以的,像我们现在TOOL的工程就是,APP里面也可以更新boot工程。因为有时候TOOL也需要更新。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 22:54 , Processed in 0.387479 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表