void EIntTickIsr(void) __attribute__((naked));
void EIntTickIsr(void)
{
//保存R0-R12寄存器到栈里.
asm volatile(' STMDB SP!, {R0-R12} ');
//关闭TICK中断.
INTMSK |= BIT_GLOBAL|BIT_TICK;
//取得保存IRQ的LR地址,并保存LR.
asm volatile (' LDR R0,=g_dwIRQLR' );
asm volatile (' SUBS LR,LR,#4 ');
asm volatile (' STR LR,[R0] ');
//取回前面保存的R0-R12寄存的值.
asm volatile (' LDMIA SP!, {R0-R12} ');
//取得最后返回的SPSR,就是SVC模式下的CPSR.
//从IRQ模式切换回到SVC模式.
asm volatile (' MRS LR,SPSR ');
asm volatile (' ORR LR,#0xc0 ');
asm volatile (' MSR CPSR,LR ');
//现在已经转换回到SVC模式,取回IRQ模式下保存的LR.
//把R0的值保存到栈中第二个位置.
asm volatile (' STR R0,[SP,#-8] ');
//从保存位置取回IRQ模式下保存的LR值.
asm volatile (' LDR R0,=g_dwIRQLR' );
asm volatile (' LDR R0,[R0] ');
//把IRQ模式下的LR保存到栈里,就是出栈时的PC值.
asm volatile (' STMDB SP!,{R0} ');
//从栈里第二个位置取回先前保存的R0值.
asm volatile (' SUBS SP,SP,#4 ');
asm volatile (' LDMIA SP!,{R0} ');
//保存R0-R12,LR到栈里,入栈顺序是刚好相反的.
asm volatile (' STMDB SP!,{R0-R12,LR} ');
//保存CPSR的值到栈里,就是SPSR的位置.
asm volatile (' MRS R4,CPSR ');
asm volatile (' BIC R4,#0xc0 ');
asm volatile (' STMDB SP!,{R4} ');
//保存栈顶到任务指针里.
asm volatile ( 'LDR R0, %0' : : 'm' (g_pCurrentTask) );
asm volatile ( 'STR SP, [R0]' );
//增加时钟计数.
g_dwTickCount++;
//
printf('g_dwTickCount = (%d)/n',g_dwTickCount);
//
//清除屏蔽位.
I_ISPC = BIT_TICK;
INTMSK &= ~(BIT_GLOBAL|BIT_TICK);
//
if (g_dwTickCount < 3)
{
g_pCurrentTask = g_pCurrentTask1;
}
else if (g_dwTickCount < 4)
{
g_pCurrentTask = g_pCurrentTask2;
}
else
{
g_dwTickCount = 0;
}
//取得新任务指针
asm volatile ( 'LDR R0, %0' : : 'm' (g_pCurrentTask) );
asm volatile ( 'LDR SP, [R0]' );
//取回SPSR值.
asm volatile ( 'LDMIA SP!, {R0}' );
asm volatile ( 'MSR SPSR, R0' );
//取回R0-R12,LR,PC值,并运行最后的任务.
asm volatile ( 'LDMIA SP!, {R0-R12,LR,PC}^' );
}
写完上面的代码,就可以真正地实现了任务调度了。有了以上的代码,写其它复杂的任务调试都变得很容易了,这些代码得来是不太容易的,我经历了好几个星期的调试才通过的。
这些都是在我的S3C44B0开发板上调试通过的
上一篇:学习ARM开发(20)
下一篇:学习ARM开发(22)
推荐阅读最新更新时间:2025-12-19 12:00
- ADR420 超精密、低噪声、5.00 Vout XFET 电压基准的典型应用
- 1.8V DC 至 DC 单路输出电源
- BD45xxx系列BD45402电压检测IC的典型应用
- AD9755-EB,使用 AD9755、14 位、300 MSPS 高速数模转换器的评估板
- 用于 30kHz PWM 调光的 LT3761EMSE-1 升压 LED 驱动器的典型应用电路
- LT1956IGN 5V 降压转换器的典型应用电路
- AD8048-EBZ,AD8048 评估板,用作 AD872(12 位、10 MSPS A/D 转换器)的驱动器
- 具有双输入的 LTC3126HFE 3.3V、2MHz 降压转换器的典型应用电路
- OM13058,用于 LPC11U68 系列 MCUS 的 LPCXpresso 评估板
- ADA4075-2ACPZ-R7 平衡线路接收器运算放大器的典型应用电路



agile_modbus源码
CC2430资料+协议栈+例程
基于LabVIEW的ARM Cortex-M3嵌入式开发
非常经典的关于LLC的杨波博士论文
VI-27WIU






京公网安备 11010802033920号