核间共享内存安排:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
150x78000000 开始,每个核有4个标志 _G_ulHoldingPen 分配了64B 实际usigned long * 4(cores) 标识当前核是否启动成功 最初由核0初始化所有核标志:置0;启动后由每个核在启动成功后置0xa1a1a1a1。 _G_iCacheBarrier 64B bool 标识是否成功到达核间同步点1 最初由核0初始化所有核标志:置0;到达后由每个核置1。 _G_iCacheBarrier1 64B bool 标识是否成功到达核间同步点2 最初由核0初始化所有核标志:置0;到达后由每个核置1。 _G_uiCoresBootFlag 64B usigned long 标识是否成功需要启动当前核 当前:由核0置1,标识所有核都要使用。
系统核core0唤醒流程:
复制代码
1
2
3
4
5
6
7
8
9
10
11使能i-cache 使能d-cache 启用mmu 初始化多核共享结构体 通知其他核本核启动完成 //向核间共享内存某个位置写指定值 唤醒其他核 1、io重映射core1,2,3的内存 //指定基地址,vmm页大小,页类型 2、根据是否需要唤醒,决定唤醒其他核 //bspCpuUp 等待两个核间同步点
bspcpuup唤醒流程:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20核间同步点1 唤醒 //操作寄存器 1、写0x01c000bc 为core_x指定的镜像烧录的基地址 2、写对应cpu_reset 0x0 3、写0x01c25c00 + 0x148 [3,2,1,0] 控制core_x 是否通过通过硬件reset L1 cache 0:允许 1:禁止 对应核,写0 4、写0x01c25c00 + 0x1e4 CPUCFG_DBG_CTL1_REG //t3手册上未显示 uiValue &= ~(1 << ucCoreNum); 5、写对应cpu_ctl 0x3 取消CPU核心复位 [0] 是否禁用对应cp15寄存器的写入访问权限 6、写0x01c25c00 + 0x1e4 uiValue | (1 << ucCoreNum) 核间同步点2
cpu_configure模块寄存器:
复制代码
1
2
3
4
5
6
7寄存器基地址:0x01c25c00 主要寄存器如下: cpu0_reset 0x40 //cpu1: +0x40 cpu2: +0x80 cpu3: +0xc0 cpu0_ctl 0x44 cpu0_state 0x48
裸核core1,2,3启动流程:
复制代码
1
2
3
4
5
6
7
8
9
10
11使能i-cache 使能d-cache 启用mmu 通知其他核本核启动完成 //向核间共享内存某个位置写指定值 //唤醒其他核 1,2,3核 被动等待0核的唤醒 // 1、io重映射core1,2,3的内存 //指定基地址,vmm页大小,页类型 // 2、根据是否需要唤醒,决定唤醒其他核 //bspCpuUp 等待两个核间同步点
i-cache与d-cache与mmu的关系
复制代码
1
2
3
4
5
6
7
8
9ICache和DCache是一种内存. 内存种类:寄存器,DDR,cache等 在速度上 CPU > 寄存器 > Cache > DDR 在容量上 CPU < 寄存器 < Cache < DDR icache用来缓存指令, icache的操作一般是自动的,不需要我们做什么,一般只需要打开或者关闭icache。 dcache用来缓存数据,dcache用的前提是mmu要启动。
如何理解裸核在单线程下的任务跳转:
复制代码
1
2
3
4
5裸核是单线程的,但是也会触发中断,一旦触发中断,就会跳转到指定的中断服务函数中,向下执行执行完成后,返回之前的任务。这一些都是单线程执行的。 即使上了系统,本质上同一时间也只有一个线程在占用从cpu,只是利用时间片轮转的算法,让人在宏观上认为是多个任务同时执行罢了。 注意: 线程的切换也需要时间,大约在微秒级别,所以当出现需要睡眠纳秒级别的情况时,往往让cpu空转,避免发生线程切换,降低效率。
最后
以上就是迷你烧鹅最近收集整理的关于AMP多核启动的全部内容,更多相关AMP多核启动内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复