作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] 每个task有自己的stack?
时间Thu Sep 21 17:42:45 2017
https://imgur.com/a/q0v5u
https://imgur.com/a/aXwIA
疑问:对我来说,在嵌入式系统里的stack就是file register,里面可以放return address
、进入functio前使用到的变数、在function里面所宣告的变数
我的直觉告诉我应该是所有的function共用一个stack,因为在嵌入式系统里面stack的总
个数是固定的,不会因为function的多寡而变化。
另外,RTOS有自己private的data structure,请问这句是甚麽意思?
想请教前辈,我的观念上哪里有错误吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.26.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1505986968.A.A67.html
※ 编辑: zzss2003 (60.248.26.157), 09/21/2017 17:45:11
1F:→ PkmX: 你对thread有概念吗? 09/21 19:09
老实说,不清楚。Google浏览器如果是Thread,那各个分页就是Process
2F:→ Lipraxde: 通常会有一组暂存器存放stack pointer,要让每个task有 09/21 19:14
3F:→ Lipraxde: 自己的stack,就会在切换task的时候把stack pointer指到 09/21 19:14
4F:→ Lipraxde: task自己的stack上。 09/21 19:14
5F:→ Lipraxde: 上网查查FreeRTOS,有个成大资工的网页介绍的很好 09/21 19:14
3Q
6F:→ chuegou: 看了这篇我确定你该先翻一下os 09/21 19:19
7F:→ er230059: Task != function 09/21 19:37
Task = subroutine
8F:推 boss0405: 书是对的,你是错的 09/21 23:41
书哪边对,我哪边错
※ 编辑: zzss2003 (60.248.26.157), 09/22/2017 10:12:27
※ 编辑: zzss2003 (60.248.26.157), 09/22/2017 10:13:38
9F:推 Sidney0503: 你需要去了解C语言执行指令时 memory发生了甚麽事情 09/22 12:21
10F:→ Sidney0503: stack和heap区在每次执行不同的事情 行为是如何 09/22 12:22
11F:→ Sidney0503: 你已经不是multi-thread或subroutine的问题 而是根本 09/22 12:22
12F:→ Sidney0503: 这个问题不管在哪个系统都一样 09/22 12:23
13F:→ Sidney0503: 简单说global static变数一开始就会存在memory 09/22 12:24
14F:→ Sidney0503: function内变数在每次进入都会push到stack 09/22 12:24
15F:→ Sidney0503: 所以有一段时期写程式变数一定要先宣告 放在一起 09/22 12:25
16F:→ Sidney0503: 做malloc则是去heap区配置memory 09/22 12:25
17F:→ Sidney0503: 离开任何区间ex: for while function stack就会清掉 09/22 12:26
18F:→ Sidney0503: 而heap上的东西一定要free才会清掉 09/22 12:26
19F:→ Sidney0503: global static则是英勇长存 09/22 12:26
20F:→ Sidney0503: 只要fork出去就会有一个概念上的stack给你用 09/22 12:28
21F:→ Sidney0503: 所以fork进入了区间 会把区域变数推到这个stack 09/22 12:28
谢谢Sideny大大的讲解,事实上,我是很清楚地知道一个program的memory配置。当一个程
式被compiled跟linked後(也就是我们俗称的.exe档),stack的大小就已经是固定的了(当
然,heap是动态配置)。当我们要去执行这个.exe档时,OS就会去读取这个program所需要
的memory(text、global/static、stack)并分配给这个program。
以上都是发生在我们PC上的事情。我想问的是,在embedded system的环境下情况是不是不
一样?。
※ 编辑: zzss2003 (60.248.26.157), 09/22/2017 15:33:02
22F:推 chuegou: 算一样吧 mmu在x86和arm的实现没有大差异 09/22 15:53
我刚刚仔细看了Mircochip的compiler如何处理stack,发现跟PC处理的方式大不相同...@@
MCU的hardware stack只能被用来存放return address,其他的data变数分别被放置在两种
不同的stack(compiled stack跟software stack)compiled stack是静态的(compile time
就会知道大小)、software stack是动态的(compiler会把剩下的memory全部给它)
※ 编辑: zzss2003 (60.248.26.157), 09/22/2017 16:06:51
23F:推 chuegou: 是那一颗阿?听叙述感觉没有mmu也没有os阿 09/22 17:07
目前在看Microchip的8-bit devices XC8 compiler
24F:→ Lipraxde: MCU跟CPU不一样啦,他要跑的是RTOS不是一般的OS 09/22 17:10
您在上面讲用stkptr的方式,我理解了,受益良多:)
25F:推 james732: embedded system可以做到跟PC一样,但通常没必要 09/22 17:14
26F:→ james732: embedded system的OS的记忆体管理会比Windows/Linux简化 09/22 17:14
※ 编辑: zzss2003 (60.248.26.157), 09/22/2017 17:24:11