电子发烧友网 > 控制/MCU > 正文

基于s3c2410的任务切换软中断级服务的实现

2018年11月08日 16:47 次阅读

1.关于软中断指令 软件中断指令(SWI)可以产生一个软件中断异常,这为应用程序调用系统例程提供了一种机制。

语法: SWI {} SWI_number SWI执行后的寄存器变化:

lr_svc = SWI指令后面的指令地址 spsr_svc = cpsr pc = vectors + 0x08

cpsr模式 = SVC cpsr I = 1(屏蔽IRQ中断)

基于s3c2410的任务切换软中断级服务的实现

处理器执行SWI指令时,设置程序计数器pc为向量表的0x08偏移处,同事强制切换处理器模式到SVC模式,以便操作系统例程可以在特权模式下被调用。

每个SWI指令有一个关联的SWI号(number),用于表示一个特定的功能调用或特性。

【例子】 一个ARM工具箱中用于调试SWI的例子,是一个SWI号为0x123456的SWI调用。通常SWI指令是在用户模式下执行的。

SWI执行前: cpsr = nzcVqift_USER pc = 0x00008000 lr = 0x003fffff ;lr = 4 r0 = 0x12

执行指令: 0x00008000 SWI 0x123456

SWI执行后: cpsr = nzcVqIft_SVC spsr = nzcVqift_USER pc = 0x00000008 lr = 0x00008004 r0 = 0x12

SWI用于调用操作系统的例程,通常需要传递一些参数,这可以通过寄存器来完成。

在上面的例子中,r0 用于传递参数0x12,返回值也通过寄存器来传递。

处理软件中断调用的代码段称为中断处理程序(SWI Handler)。中断处理程序通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的。

SWI号由下式决定: SWI_number = AND NOT《0xff000000》 其中SWI instruction就是实际处理器执行的32位SWI指令

SWI指令编码为: 31 - 28 27 - 24 23 - 0 cond 1 1 1 1 immed24

指令的二进制代码的bit23-bit0是24bit的立即数,即SWI指令的中断号,通过屏蔽高8bit即可获得中断号。

lr寄存器保存的是中断返回指令的地址,所以 [lr - 4] 就是执行SWI的执行代码。

通过load指令拷贝整个SWI指令到寄存器,使用BIC屏蔽指令的高8位,获取SWI中断号。

;read the SWI instrucTIon LDR r10, [lr, #-4] BIC r10, r10, #0xff000000 2. 周立功移植uC/OS-II到s3c2410的软中断服务级的任务切换 uC/OS-II的任务调度函数 uC/OS-II的任务级的调度是由函数OS_Sched( )完成的。

void OS_Sched (void)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */

OS_CPU_SR cpu_sr;

#endif

INT8U y;

OS_ENTER_CRITICAL();

if ((OSIntNesTIng == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */

y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */

OSPrioHighRdy = (INT8U)((y 《《 3) + OSUnMapTbl[OSRdyTbl[y]]);

if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++; /* Increment context switch counter */

OS_TASK_SW(); /* Perform a context switch */

}

}

OS_EXIT_CRITICAL();

}

详细解释可以参考《嵌入式实时操作系统 uC/OS-II》,os_sched函数在确定所有就绪任务的最高优先级高于当前任务优先级时进行任务切换,通过OS_TASK_SW( )宏来调用。

OS_TASK_SW( )宏实际上定义的是SWI软中断指令。见OS_CPU.H文件的代码:

__swi(0x00) void OS_TASK_SW(void); /* 任务级任务切换函数 */

__swi(0x01) void _OSStartHighRdy(void); /* 运行优先级最高的任务 */

__swi(0x02) void OS_ENTER_CRITICAL(void); /* 关中断 */

__swi(0x03) void OS_EXIT_CRITICAL(void); /* 开中断 */

__swi(0x40) void *GetOSFunctionAddr(int Index); /* 获取系统服务函数入口 */

__swi(0x41) void *GetUsrFunctionAddr(int Index);/* 获取自定义服务函数入口 */

__swi(0x42) void OSISRBegin(void); /* 中断开始处理 */

__swi(0x43) int OSISRNeedSwap(void); /* 判断中断是否需要切换 */

__swi(0x80) void ChangeToSYSMode(void); /* 任务切换到系统模式 */

__swi(0x81) void ChangeToUSRMode(void); /* 任务切换到用户模式 */

__swi(0x82) void TaskIsARM(INT8U prio); /* 任务代码是ARM代码 */

__swi(0x83) void TaskIsTHUMB(INT8U prio); /* 任务代码是THUMB */

__swi(0x00) void OS_TASK_SW(void); 是与ADS相关的代码,通过反汇编可以看到,调用OS_TASK_SW实际上被替换成swi 0x00 软中断指令。执行此执行,pc会跳转到向量表的0x08偏移处。

中断向量表:(见Startup.s文件)

CODE32

AREA vectors,CODE,READONLY

; 异常向量表

Reset

LDR PC, ResetAddr

LDR PC, UndefinedAddr

LDR PC, SWI_Addr

LDR PC, PrefetchAddr

LDR PC, DataAbortAddr

DCD IRQ_Addr

LDR PC, IRQ_Addr

LDR PC, FIQ_Addr

ResetAddr DCD ResetInit

UndefinedAddr DCD Undefined

SWI_Addr DCD SoftwareInterrupt

PrefetchAddr DCD PrefetchAbort

DataAbortAddr DCD DataAbort

Nouse DCD 0

IRQ_Addr DCD IRQ_Handler

FIQ_Addr DCD FIQ_Handler

执行SWI 0x00指令后,pc会跳转到SoftwareInterrupt代码处开始执行:

见Os_cpu_a.s文件的SoftwareInterrupt函数:

SoftwareInterrupt

LDR SP, StackSvc ; 重新设置堆栈指针

STMFD {R0-R3, R12, LR}

MOV R1, SP ; R1指向参数存储位置

MRS R3, SPSR

TST R3, #T_bit ; 中断前是否是Thumb状态

LDRNEH R0, [LR,#-2] ; 是: 取得Thumb状态SWI指令

BICNE R0, R0, #0xff00

LDREQ R0, [LR,#-4] ; 否: 取得arm状态SWI指令

BICEQ R0, R0, #0xFF000000 ; 如上面所述,此处通过屏蔽SWI指令的高8位来获取SWI号,r0 = SWI号,R1指向参数存储位置

CMP R0, #1

LDRLO PC, =OSIntCtxSw ;为0时跳转到OSIntCtxSwdi地址处

LDREQ PC, =__OSStartHighRdy ; 为1时,跳转到__OSStartHighRdy地址处。SWI 0x01为第一次任务切换

BL SWI_Exception ;进入中断号散转函数

LDMFD {R0-R3, R12, PC}^

StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)

以上就是任务切换软中断级服务的实现。

技术专区

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

嵌入式web server boa在S3C241...

修改Makefile文件,找到CC=gcc和CPP=gcc -E,分别将其改为交叉编译器安装的路径

发表于 2018-09-09 09:07 110次阅读
嵌入式web server boa在S3C241...

s3c2410 Timer工作原理

发表于 2018-08-20 06:21 57次阅读
s3c2410 Timer工作原理

S3C2410启动代码从ADSv1.2移植到KEIL For ARM uV4的方法

发表于 2018-07-05 03:53 243次阅读
S3C2410启动代码从ADSv1.2移植到KEIL For ARM uV4的方法

大神教会你嵌入式开发中的S3C2410初始化

在程序一开始,首先进行的一些操作主要保证初始化程序能够顺利的运行,因此主要包括关闭WDT、中断,配置...

发表于 2018-05-30 16:26 194次阅读
大神教会你嵌入式开发中的S3C2410初始化

嵌入式视觉系统设计技工作原理分析

视觉系统在现代工业生产自动化系统中应用非常广泛,主要集中于药品检测分装、印刷色彩检测、集成电路生产、...

发表于 2018-04-04 12:46 373次阅读
嵌入式视觉系统设计技工作原理分析

如何将Linux2.4移植到ARM平台的嵌入式系...

要使得标准Linux能在ARM嵌入式处理器上运作,势必要经过移植 (porting) 的过程。所谓移...

发表于 2018-03-14 15:00 345次阅读
如何将Linux2.4移植到ARM平台的嵌入式系...

基于S3C2410嵌入式设备的U-Boot移植流...

S3C2410 是三星公司针对嵌入式系统推出的高性价比微处理器,它是基于ARM9TDMI内核的16/...

发表于 2018-02-07 07:58 487次阅读
基于S3C2410嵌入式设备的U-Boot移植流...

基于Linux 软中断机制以及tasklet、工...

软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这...

发表于 2018-01-15 12:55 1169次阅读
基于Linux 软中断机制以及tasklet、工...

剖析S3C2410路由器整体结构及原理

本文介绍的一种S3C2410路由器的整体结构及工作原理,后详细地介绍了其i/o和UART及存储介质三...

发表于 2018-01-02 07:44 2392次阅读
剖析S3C2410路由器整体结构及原理

一种基于MiniGUI的GPS导航定位系统设计与...

定位系统自问世后便得到了蓬勃发展,其应用已渗入到各行各业。个人消费领域引领移动定位类型科技产品集中涌...

发表于 2017-11-30 16:39 282次阅读
一种基于MiniGUI的GPS导航定位系统设计与...

GPRS远程安防监控系统的电路设计

在此设计的基于 GPRS 的远程安防监控系统,是采用的是摄像机传送视频信号经压缩编码后,通过内部总线...

发表于 2015-11-23 17:24 1910次阅读
GPRS远程安防监控系统的电路设计

嵌入式无线监测仪系统电路设计详解 —电路图天天读...

无线监测仪是一部监测、记录用户心电数据,为用户提供实时监测预警,产品体积小、重量轻,用户携带方便,增...

发表于 2015-07-21 11:20 1451次阅读
嵌入式无线监测仪系统电路设计详解 —电路图天天读...

S3C2410中文数据手册

发表于 2015-06-06 23:41 5614次阅读
S3C2410中文数据手册

请教一个有关协处理器的ARM汇编指令

发表于 2015-01-23 14:05 2121次阅读
请教一个有关协处理器的ARM汇编指令

一种S3C2410路由器的整体结构及工作原理

本文介绍的一种S3C2410路由器的整体结构及工作原理,后详细地介绍了其i/o和UART及存储介质三...

发表于 2014-03-31 11:11 869次阅读
一种S3C2410路由器的整体结构及工作原理

基于S3C2410的CAN总线通信设计与开发

ARM芯片S3C2410没有集成控制器,为保障通讯稳定与效率,采用带SPI接口的独立CAN控制器MC...

发表于 2013-03-01 10:45 1273次阅读
基于S3C2410的CAN总线通信设计与开发

基于三星S3C2410的ARM-Linux电子控...

巡航控制系统(CCS)是20世纪60年代发展起来的,又称为恒速行驶系统。巡航控制系统工作时,ECU根...

发表于 2013-01-14 10:34 2313次阅读
基于三星S3C2410的ARM-Linux电子控...

用S3C2410解决网络式汽车防盗系统三大难题

汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防...

发表于 2013-01-07 08:54 781次阅读
用S3C2410解决网络式汽车防盗系统三大难题

基于ARM S3C2410的PDA人机接口电路

PDA实际上是一种比笔记本电脑还要小得多的手持式电脑。随着电子技术的迅猛发展,具有耗电少、亮度高、体...

发表于 2012-09-12 14:43 1443次阅读
基于ARM S3C2410的PDA人机接口电路

基于Linux的嵌入式视觉系统设计

视觉系统在现代工业生产自动化系统中应用非常广泛,主要集中于药品检测分装、印刷色彩检测、集成电路生产、...

发表于 2012-09-03 15:12 1254次阅读
基于Linux的嵌入式视觉系统设计

一种基于ARM的数字超声探伤系统设计

超声技术是无损检测的一种重要方法,很多数字探伤仪以单片机(MCU)为核心,单片机固有的性能瓶颈制约了...

发表于 2012-07-10 17:24 759次阅读
一种基于ARM的数字超声探伤系统设计

基于S3C2410的智能家居控制器设计与实现

如何将家庭里相对独立的设备连接成一个系统,从而方便进行本地和远程控制?本文通过采用ARM构成智能家居...

发表于 2012-05-04 16:44 900次阅读
基于S3C2410的智能家居控制器设计与实现

基于S3C2410嵌入式视频监控系统设计

本系统采用模块化的结构设计思想,将设备分为主控模块和各个功能模块。主控模块和各功能模块之间有统一的或...

发表于 2012-02-20 09:28 1464次阅读
基于S3C2410嵌入式视频监控系统设计

SD存储及基于S3C2410的应用

随着越来越多的电子产品支持SD存储卡, SD卡的应用范围越来越广。由32位嵌入式处理器S3C2410...

发表于 2011-12-02 09:51 934次阅读
SD存储及基于S3C2410的应用

基于嵌入式系统的手机编程开发平台

随着移动通信技术的飞速发展,手机已经从单一的电话通信设备转变为信息网络终端,因此,近年来手机编程已经...

发表于 2011-10-27 16:29 1825次阅读
基于嵌入式系统的手机编程开发平台

基于嵌入式系统的GPRS设计

嵌入式系统是一个具有特定功能或用途的计算机软硬件结合体,而 GPRS是基于现在运行的GSM基础上发展...

发表于 2011-10-25 16:26 793次阅读
基于嵌入式系统的GPRS设计

基于GPRS的电能质量在线监测系统设计

设计一种基于GPRS 无线通信的电能质量监测系统,详细阐述了基于ARM9 和MC55 的监测终端主要...

发表于 2011-10-25 14:47 1223次阅读
基于GPRS的电能质量在线监测系统设计

基于ARM的嵌入式监测系统设计

设计了一种利用ARM微处理器进行设备状态监测的方案,并对方案的设计实现方法作了具体的论述,利用图形界...

发表于 2011-10-18 16:57 1951次阅读
基于ARM的嵌入式监测系统设计

S3C2410处理器特性

S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用0.18um制造...

发表于 2011-10-10 11:52 1215次阅读
S3C2410处理器特性

ARM9系列嵌入式处理器S3C2410系统中LC...

本文以三星公司ARM9内核芯片S3C2410的LCD接口为基础,介绍了在Linux平台上开发嵌入式L...

发表于 2011-10-10 11:50 1000次阅读
ARM9系列嵌入式处理器S3C2410系统中LC...

S3C2410 bootloader(vivi)...

Bootloader有很多种,如本文将要阅读的vivi,除此之外还有uboot,redboot,li...

发表于 2011-09-28 10:08 1064次阅读
S3C2410 bootloader(vivi)...

在S3C2410上移植yaffs2文件系统

当然如果你的NAND FLASH只是512+16B的,可以只移植yaffs,因为即使你移植了yaff...

发表于 2011-09-28 10:06 812次阅读
在S3C2410上移植yaffs2文件系统

基于S3C2410的GPRS系统设计

嵌入式系统是一个具有特定功能或用途的计算机软硬件结合体,而 GPRS是基于现在运行的GSM基础上发展...

发表于 2011-09-27 16:19 672次阅读
基于S3C2410的GPRS系统设计

基于S3C2410的IP电话设计

IP电话的发展已经历了三代。第三代IP电话是Internet普及的产物,目前,以太网接口直接入户已经...

发表于 2011-09-22 14:49 742次阅读
基于S3C2410的IP电话设计

基于S3C2410的GPRS模块的设计

嵌入式系统是一个具有特定功能或用途的计算机软硬件结合体,而 GPRS是基于现在运行的GSM基础上发展...

发表于 2011-09-21 17:08 1166次阅读
基于S3C2410的GPRS模块的设计

基于ARM的橡塑机械双层网络设计

针对橡塑机械对监控的需求,设计了一款以AKM9、嵌入式Linux为核心,以CAN总线技术和网络技术为...

发表于 2011-09-20 14:52 318次阅读
基于ARM的橡塑机械双层网络设计

基于ADS的S3C2410实现嵌入式串口通信

引言 ARM ADS全称为ARM Developer suite(ARM开发套件)。ADS的Code...

发表于 2011-09-19 09:36 971次阅读
基于ADS的S3C2410实现嵌入式串口通信

基于S3C2410的网络式汽车防盗系统

汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防...

发表于 2011-09-15 18:26 645次阅读
基于S3C2410的网络式汽车防盗系统

基于微处理器和UDAl34l的嵌入式音频系统设计

S3C24lO是Samsung公司一款基于ARM920T核的微处理器,通过ⅡS音频总线与UDAl34...

发表于 2011-08-16 16:55 511次阅读
基于微处理器和UDAl34l的嵌入式音频系统设计

基于ARM9的UDA1341驱动在Linux下移植方法

发表于 2011-08-05 09:43 1989次阅读
基于ARM9的UDA1341驱动在Linux下移植方法

Linux和S3C2410的PROFIBUS-D...

针对标准PROFIBUS—DP主站在国内研究较少,自主研发产品的功能有限、智能化不足的现状,进行了基...

发表于 2011-06-21 11:52 629次阅读
Linux和S3C2410的PROFIBUS-D...

嵌入式Linux下S3C2410的调色板彩色显示

对于一个显示设备,数据的更新率正比于画面的像素数和色彩深度的乘积。在嵌入式Linux系统中,受处理器...

发表于 2011-06-07 11:30 684次阅读
嵌入式Linux下S3C2410的调色板彩色显示

MINIGUI在S3C2410开发板的移植

本文讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,其内容不仅仅限于 MiniGUI...

发表于 2011-05-16 11:10 725次阅读
MINIGUI在S3C2410开发板的移植

基于S3C2410和CH7004的嵌入式系统VG...

  1 引言   嵌入式系统的终端显示倾向选择LCD显示器。但在大屏幕显示情况下,大型工业级LCD...

发表于 2010-10-30 10:18 669次阅读
基于S3C2410和CH7004的嵌入式系统VG...

基于S3C2410的恒温式自动量热仪的设计

  0 引言   量热仪是能测定固、液态物质,如煤炭、火药、粘度油、食品、饲料等可燃物质热值的

发表于 2010-10-13 10:09 438次阅读
基于S3C2410的恒温式自动量热仪的设计

基于ARM9处理器S3C2410的数字多路语音记...

1. 引言 数字多路语音记录器在安全、监控方面有很多应用。一些传统的设计方案基于工控机,用数据采集卡...

发表于 2010-09-16 16:32 774次阅读
基于ARM9处理器S3C2410的数字多路语音记...

基于S3C2410及嵌入式Linux的氢气浓度的...

氢气是一种无色无味、携带极不方便、极易泄漏的气体,在室温和标准大气压下,氢气与空气的混合比例达到4....

发表于 2010-06-30 15:16 479次阅读
基于S3C2410及嵌入式Linux的氢气浓度的...

基于S3C2410平台和WinCE的数字视频监控...

笔者设计的一种嵌入式系统,以WinCE操作系统和ARM硬件平台为核心实现了对现场的实时监控,并通过无...

发表于 2010-06-30 15:07 632次阅读
基于S3C2410平台和WinCE的数字视频监控...

S3C2410设计的无线数据采集系统

S3C2410设计的无线数据采集系统 手持终端的功能越来越强大,数据处理能力也越来越强,人们对其无...

发表于 2010-05-20 09:20 468次阅读
S3C2410设计的无线数据采集系统

s3c2410大元件的分割和放置

s3c2410大元件的分割和放置 在面对s3c2410等大元件的时,由于引脚很多,所以需要在设计原...

发表于 2009-11-17 10:00 321次阅读
s3c2410大元件的分割和放置

ADS环境下基于S3C2410串口应用程序的开发

ADS环境下基于S3C2410串口应用程序的开发 0 引言   ARM ADS全称为ARM ...

发表于 2009-11-06 11:17 585次阅读
ADS环境下基于S3C2410串口应用程序的开发