ASM 板


LINE

看板 ASM  RSS
我被Jserv抓来回应这篇文了。 ※ 引述《wei115 (ㄎㄎ)》之铭言: : 大大们晚安 : 小弟最近在看jserv大大的mini-arm-os遇到了些问题 : 在 https://github.com/jserv/mini-arm-os/blob/master/04-Multitasking/os.c : 其中的 : unsigned int *create_task(unsigned int *stack, void (*start)(void)) : { : stack += STACK_SIZE - 17; : stack[8] = (unsigned int) THREAD_PSP; : stack[15] = (unsigned int) start; : stack[16] = (unsigned int) 0x01000000; /* PSR Thumb bit */ : stack = activate(stack); : return stack; : } : 他直接把自动push的值设定好之後(此时是特权级的thread mode),然後就直接在lr上写入 : 0xFFFFFFFD(之後activate函式会把bx lr给pc),然後就直接用handler返回的形式跳到用 : 户级的thread mode,并且自动pop出stack内的值回暂存器 : 而根据这张图 : https://i.imgur.com/SpobiVy.jpg
: 由特权级的thread mode到用户级的thread mode的方法应该只有修改CONTROL暂存器,并 : 没办法直接用handler mode返回的方式去到用户级的thread mode : 而在找资料的过程中,发现以前这个函式好像是长这样 : unsigned int *create_task(unsigned int *stack, void (*start)(void)) : { : static int first = 1 : stack += STACK_SIZE - 32; : if(first) { : stack[8] = (unsigned int) start; : first = 0; : } else { : stack[8] = (unsigned int) THREAD_PSP; : stack[15] = (unsigned int) start; : stack[16] = (unsigned int) 0x01000000; /* PSR Thumb bit */ : } : stack = activate(stack); : return stack; : } : 有区分第一次进入用户级的thread mode,并在第一次进入时修改CONTROL暂存器的方法, : 之後才用从handler mode返回的方式去执行 : 这在06-Preemptive : https://github.com/embedded2015/mini-arm-os/blob/master/06-Preemptive/os.c : void task_init(void) : { : unsigned int null_stacks[32]; : init_activate_env(&null_stacks[32]); : } : 也有残留(?),可是不知道为什麽之後的版本都没有了(除了06外),都是直接返回到 : user_task : 後来我又看了程式码,发现在reset的时候有一个reset_handler的中断,我那时就猜测 : 可能在reset时cortex m3是处於handler mode,此时用异常返回的方式进入user_task也 : 是合情合理的事 这边我说明一下,这是我改的,当初是根据 https://github.com/jserv/mini-arm-os/commit/b4c7473db87eca03ca022fb44ffe39de953 所以决定把activate的if (first)通通都拔掉来简化code 因为我好像(?)当初也误认为reset_handler是一个excption,所以是在handler mode 不巧的是,reset_handler在arm的spec中有特别注明 Execution restarts as privileged execution in Thread mode 所以这就变成了在Thread mode将lr assign成EXEC_RETURN,再bx lr导致undefined behavior。 而我烧上HW看了一下,这个behavior会导致systick exception失效所以你才会看到 卡在前面两行。 而刚好,在QEMU环境下是可以正常执行的,所以当时验证时就没有注意到这件事。 而我也好一阵子没碰这个Repo了...所以就这样都没人发现哈哈 06-Preemptive的task_init()是用比较tricky的方式去切换到handler mode, 我个人认为这个方法并不是很好,因为会浪费一个svc handler, 这部分我之後也会修正一下。 这个BUG已经在我local端修好了,我先开一个issue随後会把PR弄上 https://github.com/jserv/mini-arm-os/issues/27 PR会是关於reset时的thread mode转换 最後强烈建议一下有疑问就直接到github开issue, 我相信有人有看到知道就会回答你, 不然Jserv没寄信我根本不知道有这件事RRR : 但在程式码看的差不多的时候,想要上机测试看看时,却发生了问题 : 机器没反应..... : 我使用的机器是STM32F103C8T6,使用04-Multitasking会有问题 : https://github.com/embedded2015/mini-arm-os/blob/master/04-Multitasking/os.c : print_str("OS: Starting...\n"); : print_str("OS: First create task 1\n"); : usertasks[0] = create_task(user_stacks[0], &task1_func); : task_count += 1; : print_str("OS: Back to OS, create task 2\n"); : usertasks[1] = create_task(user_stacks[1], &task2_func); : task_count += 1; : print_str("\nOS: Start multitasking, back to OS till task yield!\n"); : current_task = 0; : 传回来的只有前面两行 : OS: Starting... : OS: First create task 1 : 之後载入usertask和执行的地方完全没有画面.... : 然後我把06-Preemptive的task_init丢进来後,就正常运作了..... : ???????????? : 所以在开机的时候处理器的状态是特权级的thread mode?reset handler是跑在这个模式? : 可是如果这样,那为什麽里面会直接从特权级的thread mode用handler mode返回的形式 : 往PC写入EXC_RETURN? : 感觉好乱,没办法好好表达...... : 感谢 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.16.184
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1537808430.A.B06.html
1F:推 wei115: 感谢解答,github还不太会用,之後再去学学看 09/25 20:35







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP