RT-Thread 版本:4.1.0 master 版本。
完整工程代码如下:可运行在 Cortex-A53 架构上的 RTT

1. Idle 默认栈大小为 256 字节,导致任务切换触发异常

Arch64 状态下,RT-thead 的任务切换触发未知错误。

经过测试,是因为 idle 初始化时,栈溢出,修改了就绪列表的值,导致任务切换失败.

#ifndef IDLE_THREAD_STACK_SIZE
#if defined (RT_USING_IDLE_HOOK) || defined(RT_USING_HEAP)
#define IDLE_THREAD_STACK_SIZE  256
#else
#define IDLE_THREAD_STACK_SIZE  128
#endif /* (RT_USING_IDLE_HOOK) || defined(RT_USING_HEAP) */
#endif /* IDLE_THREAD_STACK_SIZE */

可以手动设置 IDLE_THREAD_STACK_SIZE 大小更改 IDLE 任务栈大小。问题解决。

2. 栈初始化时,未对栈指针进行对齐操作,导致任务切换时触发 sp 指针对齐失败异常

串口报错如下:
[0]switch to priority#255 thread:tidle0(sp:0x41019024), from thread:tshell(sp: 0x42058f20)
[SYNC Error]: in EL1
ELR_EL1 =0x000000004100045c
ESR_EL1 =0x000000009a000000
current Exception Level exception, SPsel = 0
x0 =0x0000000000000000  x1 =0x0000000000000001
x2 =0x0000000000000000  x3 =0x0000000000000000
x29 =0x000000000000001d x30 =0x0000000041003134
[INFO]: CPU Reboot now!!!

查看手册得知,ELR_EL1 =0x000000004100045c,该异常由 sp 指针对齐失败导致的。

解决:由于当前 sp 指针为 4 字节对齐的,所以失败,在 rt_hw_stack_init() 中 将 sp 指针进行 16 字节对齐,问题解决。

    /** TODO sp 指针4字节对齐不行,64位任务环境下的任务切换会失败,更改为 16 字节对齐*/stack_addr = RT_ALIGN_DOWN((rt_ubase_t)stack_addr, sizeof(rt_ubase_t) * 2);

注意:栈指针16字节对齐,是编程向导手册中要求的(8.2.1章节)!!!经过测试,8字节对齐确实不行

3.每一次通过 shell 命令读取系统 tick 计数都是 0

测试发现,shell 输入回车以及任一shell命令导致系统 tick 计数清零。

经过调试分析,在rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER) 代码前后将 rt_tick 清零。

继续测试,是rt_sem_release() 中的rt_schedule()rt_tick清零。

继续测试,问题出现在rt_schedule()中的 rt_hw_context_switch_interrupt()的汇编实现中。

原因:汇编代码中变量访问越界造成该问题。

rt_hw_context_switch_interrupt()的汇编实现中,会用到三个外部定义的变量:

.globl rt_thread_switch_interrupt_flag
.globl rt_interrupt_from_thread
.globl rt_interrupt_to_thread

这三个外部变量定义在 libcpu 文件夹下对应架构的 interrupt.c 文件中。

volatile rt_ubase_t rt_interrupt_from_thread = 0;
volatile rt_ubase_t rt_interrupt_to_thread = 0;
volatile rt_uint32_t rt_thread_switch_interrupt_flag = 0;

其中,变量 rt_thread_switch_interrupt_flag 定义为无符号的32位整型,而在rt_hw_context_switch_interrupt()的汇编实现中,我们使用 Xn 寄存器来访问这个变量,而 Xn 寄存器是64位的,导致访问越界,而刚好, rt_thread_switch_interrupt_flag 变量地址为 0x41019144, 变量rt_tick 地址为 0x41019148, 所以当我们以 64 位宽度对 rt_thread_switch_interrupt_flag 置1或清0时,我们都会将 rt_tick 清0。

解决:

变量 rt_thread_switch_interrupt_flag 的初始类型为:

volatile rt_uint32_t rt_thread_switch_interrupt_flag = 0;

现在更改为:

volatile rt_ubase_t rt_thread_switch_interrupt_flag = 0;

问题解决。

64位 RT-Thread 移植到 Cortex-A53 系统 bug 修复笔记相关推荐

  1. 安装ao 服务器为空,如何在64位Windows操作系统中安装现场审计实施系统AO2011

    龚泽平 [摘 要]对于医院审计.医保审计等各种需要消耗大量内存的审计工作来讲,64位系统具有更加明显的优势.但是当前国家审计署所研发的现场审计实施系统是基于32为系统的,在一定程度上让计算机软硬件都发 ...

  2. chrome android 85,终于!安卓版Chrome 85将升级到原生64位:支持Android 10及以上系统...

    原标题:终于!安卓版Chrome 85将升级到原生64位:支持Android 10及以上系统 安卓对64位的支持是从2014年的Android 5.0开始的.可时至今日,谷歌自己的Chrome for ...

  3. 64位Win8企业版出现“Unknown Hard Error”系统警告的一个解决方法

    昨天试装64位Win8企业版,安装应用软件后,系统重启时打开桌面直接跳出系统警告,大致意思为:Unknown Hard Error 刚开始觉得硬件有问题,因为刚插了根4G内存条,后来试过多次,一直有这 ...

  4. 预装64位Win8/8.1电脑安装64位Win7详细过程(单/双系统)

    http://www.iruanmi.com/install-64bit-windows-7-on-a-pre-installed-win8-pc/ 很多人买了预装64位Win8/8.1的电脑后想重装 ...

  5. 计算机用户账号分类,win7 64位旗舰版的三种windows系统账户类型

    电脑系统账户是大部分用户都有接触到的,我们都知道电脑室可以设置用户账户的,在使用之前我们需要先弄清楚Win7系统有几种账户类型.在 Windows7 64位旗舰版系统 中用户账户有以下3种类型:管理员 ...

  6. 64位 计算机 最大内存,win10 64位最大支持内存是多少_win10系统最高支持多大内存...

    许多用户认为,win10电脑应该内存越大那么运行速度也就会越快,因此常常会给自己的win10 64位系统增加内存条,可是有些用户可能不知道,win10系统所能承受的内存空间也是有限制的,那么win10 ...

  7. 64位W7系统安装内存8G,但是系统只显示3.2G,是怎么回事?

    遇到内存BIOS检测只有4G, 但系统显示有8G内存,可用只有3.2,主要是电脑内存或BIOS的问题.这台电脑集显占用内存768m,实际无法使用内存巧好为BIOS无法检测的4G内存.解决这个问题可以用 ...

  8. php win8 下载64位下载,WIN8.1x64纯净专业版GHO系统下载20180713

    GHO Win8.1_ x64 镜像 文件大小:3.87GB   系统未做减删 类型:GHO镜像文件 调整:进一步优化系统预留搜狗输入法纯净版,减少过期软件 Ghost WIN 8.1 位旗舰装机版V ...

  9. 迅为RK3399开发板瑞芯微64位六核Linux安卓8.1系统

    iTOP-3399 开发平台是基于瑞芯微的 RK3399 处理器设计开发的一款产品,Rockchip RK3399 是瑞芯微推出的一款低功耗,高性能的应用处理器芯片.该芯片基于 Big.Little ...

最新文章

  1. Java h265视频抽帧提取照片支持Window,Linux
  2. [原]vue实现全选,反选
  3. c++数据结构中 顺序队列的队首队尾_yiduobo的每日leetcode 622.设计循环队列
  4. ICanPay 统一支付网关
  5. Android studio之如何快速查看页面的布局
  6. Couchbase 2.0归类视图简介
  7. zTree加Layui 实现增加和删除,有子节点不允许删除
  8. d3.js——饼状图
  9. AR软件开发一个要多少钱?分享AR内容制作市价
  10. iQOO Z3、OPPOK9和小米11青春版的区别 哪个好
  11. Elasticsearch语法知多少之Multi_match query
  12. 2020支付行业七大预测:聚合支付牌照有望正式落地
  13. Launchpad是什么?Launchpad使用教程
  14. 一分钟让你知道黑白照片修复彩色软件有哪些?
  15. 【新概念4】【6】the sporting spirit
  16. 中国 GitHub 霸榜乱象! 国内程序员的脸都被丢尽了!
  17. 整洁架构读书笔记(Clean Architecture)
  18. 阿里巴巴2008校园招聘在线宣讲会
  19. 2017年计算机应用基础,计算机应用基础考试试题及答案
  20. kpi绩效考核流程图_关于KPI运用,KPI绩效考核如何运作起来(内含企业KPI实例之详解)...

热门文章

  1. R语言交叉验证(详细)
  2. 相关系数,互相关函数,协方差,卷积
  3. 统计学——线性回归公式推导
  4. 数据库MySQL之如何添加、删除列?
  5. CentOS7.9下安装Oracle19c
  6. 投稿前如何查询期刊的审稿周期
  7. linux文件目录管理
  8. matlab 脱离mcr,MATLAB生成exe脱离matlab运行可执行程序
  9. 使用Matlab对二值图像进行轮廓提取
  10. Hash 表详解(哈希表)