找回密码
 注册
关于网站域名变更的通知
查看: 397|回复: 1
打印 上一主题 下一主题

AMP架构双核应用程序开发和软中断处理(2)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-3 13:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

: u/ f2 o3 h+ ^! s! H3 _0,前言背景' V+ c: l+ c0 \* N
这节课讲了中断。可能很多人和我一样不理解什么是中断。其实这个概念说起来很好理解,就是简单的停下来。可是又有什么用处?在系统设计中又处于什么样的一个地位呢?+ |/ W8 }6 _* Z' T
这里引荐博文(不知道不翻墙能不能看)中断解析
6 S) L( J# w* T. q这里先综合百度维基百科中的,加上我的理解,说说什么是中断。中断简单的来理解就是一种技术,这种技术可以显著提高计算机的工作效率。因此有比较重要的作用。这么重要,那么到底什么是中断???这里不用教科书中的定义(中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。)。简单的打一个比方。假设我正在敲的博文是我正在执行的系统。那么我点击Ctrl + S就可以理解为一个中断。因为CSDN官方不可能随时每隔1us给我保存一次我的数据,而我的保存指令可以理解为一个中断,这个时候,系统就会将我的数据上传至服务器。而在我写博文没有点击保存的时间,服务器就可猥琐欲为的去做任何事情。这就是所谓的中断。下图就是博文中的图,用以借鉴。中断回调函数可以就是异常处理,而回调函数就是我们CPU响应中断所执行的内容。用前面那个例子,就是保存我的博文至服务器,就是我的中断回调函数。
/ p9 s: W( S* v. |% Y6 ] 9 {( x# z% L+ R- K5 t

2 J7 b) z7 z8 N/ x1,中断详解与设计实现
5 {8 y! Z4 b5 g# G8 F5 }$ U2 n软中断,由CPU0或者CPU1发起,可以相互中断。
$ V' d7 B! s) ]' O# jGIC(Generic Interrupt Controller)通用中断控制器。通关软终端进行控制核间的中断,控制出发那个CPU。
( Z- ]: X, k3 v& h& }) ^6 V
& k4 e0 \0 H) z: ~* D/ F下面是老师总结的一般处理过程
2 h6 O! x& ^8 v/ A# O8 b. e# j
1 ^* F7 _5 e, h3 n8 E5 H中断回调函数是什么。由于外部请求触发的一个中断,而CPU中断的这段时间所做的事情,就是中断回调函数的执行的。中断也有其优先级,可以进行设置。
, a5 u, P2 j) X4 e& M( E6 X/ ]) }! A; k; l
接下来就是代码分析首先定义一个初始化函数用于主函数调用。我们先看初始化函数3 v& [1 Z! g7 O8 n; t
先看这个函数Xil_ExceptionInit();就是初始化,打开handler
9 \$ H& x/ U2 F1 Q  W, f该函数是一个公共API,用于跨所有受支持的ARM处理器初始化异常处理程序。对于ARM Cortex-A53、Cortex-R5和Cortex-A9,异常处理程序正在被静态初始化,而这个函数什么也不做。但是,它仍然用于处理向后兼容性问题(在早期版本的bsp中,这个API用于初始化异常处理程序)。
* P) |4 }# {+ j1 Q$ |5 |# L其次就和GPIO中的类似了。先得到期间地址,在初始化。
; h+ y1 |( Z/ K
9 K* r- A, O4 }, v) u        status = XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);$ g0 B" x. b, K% I; }# y0 Z2 \' }9 A
        if(status != XST_SUCCESS){
: R, w2 R8 B9 \3 b9 I                return status;
7 t1 Z3 e8 @$ n; A9 q        }" V) `: q1 p6 T4 a* ?
7 E0 A* g2 O0 F7 o
一般这种写法是由于返回值是一个状态,我们定义一个变量,用于判断返回值是否正确,用于调试程序。
+ T  D* F) k: N0 ^+ Z) r5 l1 V接下来是Xil_ExceptionRegisterHandler。异常注册管理器。(Xil_ExceptionHandler)XScuGic_InterruptHandler这是一个强制类型转换,其中的函数是用于设置中段优先级的。这里没有用到,因为只有一个中断。这里就将信息传回到CPU了。接下来就是连接软中断回调函数。XScuGic_Connect就是我们的连接函数。6 _  [7 w5 U$ k6 r* ~- ~

% U5 u, a+ b! @7 ]* H' b  p5 V5 ~! M: q) S$ [3 P
这是函数的说明。函数有返回值。我们使用同样的方式。方便调试。
) V8 ~6 Y4 I& s1 @接下来使能软中断。(连接之后,需要使能才能使用)传递进去参数就是连接的。首先是实例化的XScuGic的指针其次是中断ID。$ C  W6 i3 h% s- H/ o8 ]$ P
最后是使能处理过程。+ [5 _, `; H& L* e' M3 J

6 ?, c, e  G- {9 m/ N    //initial gic & software intr6 ^! O2 V7 o( W% p1 T( N
    int initSwIntr(){* `+ N! R( L2 w5 q
            int status;! \$ Z8 h% o8 ~2 F* c" I+ B4 @/ A
            Xil_ExceptionInit();//打开系统异常
4 i& O, I6 r8 G/ a! C  P; s            ScuGicCfgPtr = XScuGic_LookupConfig(GIC_ID);% d- p, l6 c' _: I2 Z
            status = XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);
# i- k  {: |# @' Y2 r( [6 {' J            if(status != XST_SUCCESS){, H  Y3 t, L2 o' M. m1 @- }& `
                    return status;
9 R  A6 I: ]( F3 f) V7 w4 G( @            }
0 R6 s9 Y; s) v- x6 g            Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);* Y+ z  O. w8 K: V! D0 f
            status = XScuGic_Connect(&ScuGic,CPU0_SW_INTR,(Xil_ExceptionHandler)cpu0IntrHandler,&ScuGic);( v( f3 v) d* d. p$ t
            if(status != XST_SUCCESS){, ]) o# u/ r; v) B% J$ ~3 h/ X
                            return status;
, w3 {9 |. q: X8 Y1 j- h5 s7 T/ l$ q                    }* b, W6 s/ f. n3 e2 J
            XScuGic_Enable(&ScuGic,CPU0_SW_INTR);7 v' c- H- W8 k5 Y) y! e, T
            Xil_ExceptionEnable();- ?0 l, C/ v; _
            return XST_SUCCESS;( j, I, W; e/ B$ i) X$ ]! f
    }
9 P* \$ I) Q8 o) v7 k; f8 i# a
, E; C/ b8 v- F% J" E- q/ O接下来对回调函数内容进行编写。、, {& |( S6 t5 m+ q
6 p0 y4 |6 a) R1 ~
    //callback function7 f* @2 r% Z' R( d% |+ i0 x3 p& h
    void cpu0IntrHandler(void * Callbackref){4 i# `+ v6 o, Y2 u4 I8 g. O
            printf("cpu1 interrupt cpu0 success ! \n\r");$ q) [# K' a* f; A( X; t
    }
! P* b' |3 w5 j5 R' L; m/ f6 o9 x$ Q* ^2 ~. Q  k% k
接下来就是主函数
& @& c; ?* D0 \$ W& K, x* ~主函数进行初始化中断。然后就可以使用中断了。
! a" s1 o8 M4 Y5 M$ Z4 C8 z0 h
0 G6 O' R. h+ T, I! ~int main()0 _+ L/ L8 a! B; v; {3 C* g& |% g
{
% C# y. X: _$ t' C) Y        COMM_VAL = 0;
1 c2 q3 l! U. b" N: F! _        Xil_SetTlbAttributes(0xffff0000,0x14de2);
0 ]/ S( \; ^; C! v3 D        int status;
! a* [5 }# K" W; k        status = initSwIntr();! h! `4 \6 n+ s
        if(status != XST_SUCCESS){+ C4 F: z  R5 o/ ^) r5 K
                return status;! T: q$ M2 l+ t4 R# U& P
        }
/ K, f- Y. E0 W: U        while(1) {, R0 `( s: a% a3 k' [' E
                print("Hello CPU0\n\r");6 o. _4 @* e. b* G
                XScuGic_SoftwareIntr(&ScuGic,CPU1_SW_INTR,XSCUGIC_SPI_CPU1_MASK);
; I) e' M0 M& g' Z) g4 A& K                usleep(2000000);, r! D$ k/ w% x  w& ^6 Q" Y
                COMM_VAL = 1;) D/ \! w+ R3 K1 O4 t! X; w7 O
        }
% g7 h2 P0 O; g    return 0;4 G) ]/ H" u: r5 W+ O
}4 N% l  ~  v- a. T

7 Z0 o- |+ a; y& n& `: C这里的中断使用方式就是调用这个函数。XScuGic_SoftwareIntr$ \1 v' V+ k- p- [! U7 P
结构体指针,初始化ID,CPUID。
7 H# @' R8 R2 K1 u这里的中断只是发起,至于执行什么,完全是由中断函数决定的
1 p" R( {8 W2 h4 x$ ]' u& ?# ]' w/ C. q2 _/ W9 x' u

. N0 O5 s* c  w7 i% v
/ s/ X, P2 g: j, s8 U- d4 g1 s同样使用一样的代码。对CPU1进行中断的测试。
' u( Z# }$ h$ @8 l这里只有修改CPU1-CPU0即可。7 t! q( d0 L- u( i. J
* r: Q1 s6 ~, R6 i, U
最后可以看到结果。两秒发送一次,使能中断成功!!!
9 A5 J' x3 ^  b
4 K0 _# V% ?" C1 g! Z# I4 e7 t! M

该用户从未签到

2#
发表于 2020-12-3 14:30 | 只看该作者
AMP架构双核应用程序开发和软中断处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 20:28 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表