ASM 板


LINE

看板 ASM  RSS
大大们晚安 小弟最近在看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也 是合情合理的事 但在程式码看的差不多的时候,想要上机测试看看时,却发生了问题 机器没反应..... 我使用的机器是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), 来自: 59.126.109.77
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1534260340.A.DC5.html







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灯, 水草

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

TOP