我是靠谱客的博主 迷你烧鹅,最近开发中收集的这篇文章主要介绍AMP多核启动,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

核间共享内存安排:

0x78000000 开始,每个核有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
标识是否成功需要启动当前核
当前:由核01,标识所有核都要使用。

系统核core0唤醒流程:

使能i-cache
使能d-cache
启用mmu
初始化多核共享结构体
通知其他核本核启动完成
//向核间共享内存某个位置写指定值
唤醒其他核
1、io重映射core1,2,3的内存	//指定基地址,vmm页大小,页类型
2、根据是否需要唤醒,决定唤醒其他核	//bspCpuUp
等待两个核间同步点

bspcpuup唤醒流程:

核间同步点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模块寄存器:

寄存器基地址:0x01c25c00
主要寄存器如下:
cpu0_reset	0x40
//cpu1: +0x40 cpu2: +0x80	cpu3: +0xc0
cpu0_ctl	0x44
cpu0_state	0x48

裸核core1,2,3启动流程:

使能i-cache
使能d-cache
启用mmu
通知其他核本核启动完成
//向核间共享内存某个位置写指定值
//唤醒其他核
1,2,3核 被动等待0核的唤醒
//	1、io重映射core1,2,3的内存	//指定基地址,vmm页大小,页类型
//	2、根据是否需要唤醒,决定唤醒其他核	//bspCpuUp
等待两个核间同步点

i-cache与d-cache与mmu的关系

ICache和DCache是一种内存.
内存种类:寄存器,DDR,cache等
在速度上
CPU > 寄存器 > Cache > DDR
在容量上
CPU < 寄存器 < Cache < DDR
icache用来缓存指令, icache的操作一般是自动的,不需要我们做什么,一般只需要打开或者关闭icache。
dcache用来缓存数据,dcache用的前提是mmu要启动。

如何理解裸核在单线程下的任务跳转:

裸核是单线程的,但是也会触发中断,一旦触发中断,就会跳转到指定的中断服务函数中,向下执行执行完成后,返回之前的任务。这一些都是单线程执行的。
即使上了系统,本质上同一时间也只有一个线程在占用从cpu,只是利用时间片轮转的算法,让人在宏观上认为是多个任务同时执行罢了。
注意:
线程的切换也需要时间,大约在微秒级别,所以当出现需要睡眠纳秒级别的情况时,往往让cpu空转,避免发生线程切换,降低效率。

最后

以上就是迷你烧鹅为你收集整理的AMP多核启动的全部内容,希望文章能够帮你解决AMP多核启动所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部