uC/OS-II在S3C44B0X微处理器上的移植
- ·Core 2 Duo与Core Duo处理器对比测试
·未来趋势 AMD低功耗双核3800+处理器评
·采用酷睿2核心 奔腾E双核处理器深入评
·你真的了解“双核处理器”吗?
·Intel和AMD双核心处理器的比较
·为系统处理器编写Linux设备驱动程序
·跨越3GHz门槛 AMD X2 6000+处理器测试
·2G轻取3.8G Conroe平台对阵老款P4处理
·省电就是省钱 低功耗AM2处理器选购指
·狸猫换太子 揭露盒装双核PD处理器黑幕
设置includes.h中与处理器&编译器相关的代码
以下是引用片段:
#define INT8U unsigned char
#define INT16U unsigned short
#define INT32U unsighed long
#define OS_STK unsigned long
#define BOOLEAN int
#define OS_CPU_SR unsighed long
#define INT8S char
extern int INTS_OFF(void);
extern void INTS_ON(void);
#define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF() }
#define OS_EXIT_CRITICAL() { if(cpu_st == 0) INTS_ON(); }
#define OS_STK_GROWTH 1
#define STACKSIZE 256
INTS_OFF
mrs r0, cpsr ;当前CSR
mov r1, r0 ;复制屏蔽
orr r1, r1, #0xC0 ;屏蔽中断位
msr CPSR, r1 ;关中断(IRQ and FIQ)
and r0, r0, #0x80 ;从初始CSR返回FIQ位
mov pc, lr ;返回
INTS_ON
mrs r0, cpsr ;当前CSR
bic r0, r0, #0xC0 ;屏蔽中断
msr CPSR, r0 ;开中断(IRQ and FIQ)
mov pc, lr ;返回 用C语言编写与OS相关的函数(OS_CPU_C.C)
以下是引用片段:
OSTaskStkInit——初始化任务堆栈
OS_STK * OSTaskStkInit(void (*task) (void *pd), void *pdata, OS_STK *ptos,
INT16U opt)
{
unsighed int *stk;
stk = (unsighed int *)ptos; /*装载堆栈指针*/
opt++;
/*为新任务建立堆栈*/
*--stk = (unsigned int) task; /*pc*/
*--stk = (unsigned int) task; /*lr*/
*--stk = 12; /*r12*/
*--stk = 11; /*r11*/
*--stk = 10; /*r10*/
*--stk = 9; /*r9*/
*--stk = 8; /*r8*/
*--stk = 7; /*r7*/
*--stk = 6; /*r6*/
*--stk = 5; /*r5*/
*--stk = 4; /*r4*/
*--stk = 3; /*r3*/
*--stk = 2; /*r2*/
*--stk = 1; /*r1*/
*--stk = (unsigned int) pdata; /*r0*/
*--stk = (SUPMODE) /*cpsr*/
*--stk = (SUPMODE) /*spsr*/
return ((OS_STK *) stk);
}
void OSTaskCreateHook(OS_TCB *ptcb) 创建任务
void OSTasdDelHook(OS_TCB *ptcb) 删除任务
void OSTaskSwHook(void) 切换任务
void OSTaskStatHook(void) 任务执行状态
void OSTimeTickHook(void) 时钟节拍 用汇编与处理器相关的函数(OS_CPU.ASM)
1.OSStartHighRdy( ); 运行优先级最高的就绪任务
以下是引用片段:
OSStartHighRdy
LDR r4, addr_OSTCBCur ;得到当前任务TCB地址
LDR r5, addr_OSTCBHighRdy ;得到最高优先级任务TCB地址
LDR r5, [r5] ;获得堆栈指针
LDR sp, [r5] ;转移到新的堆栈中
STR r5, [r4] ;设置新的当前任务的TCB地址
LDMFD sp!, {r4} ;从栈顶获取新的状态
MSR SPSR, r4
LDMFD sp!, {r4} ;从栈顶获取新的状态
MSR CPSR, r4 ;CPSR处于SVC32Mode模式
LDMFD sp!, {r0-r12, 1r, pc} ;运行新的任务 2.OS_TASK_SW( ); 任务级的任务切换函数
以下是引用片段:
OS_TASK_SW
STMFD sp!, {pc} ;保存pc
STMFD sp!, {1r} ;保存1r
STMFD sp!, {r0-r12} ;保存寄存器&返回地址
MRS r4, CPSR
STMFD sp!, {r4} ;保存当前的的PSR
MRS r4, SPSR
STMFD sp!, {r4} ;保存SPSR
; OSRrioCur = OSPrioHighRdy
LDR r4, addr_OSPrioCur
LDR r5, addr_OSPrioHighRdy
LDRB r6, [r5]
STRB r6, [r4]
;得到当前任务地址
LDR r4, addr_OSTCBCur
LDR r5, [r4]
STR sp, [r5] ;保存sp在被占先的任务的TCB
;得到最高优先级任务TCB地址
LDR r6, addr_OSTCBHighRdy
LDR r6, [r6]
LDR sp, [r6] ;得到新任务堆栈地址
; OSTCBCur = OSTCBHighRdy
STR r6, [r4]
;保存任务方式寄存器
LDMFD sp!, {r4}
MSR SPSR, r4
LDMFD sp!, {r4}
MSR CPSR, r4
;返回到新任务的上下文
LDMFD sp!, {r0-r12, 1r, pc} 3. OSIntCtxSw(); 中断级的任务切换函数
以下是引用片段:
OSIntCtxSw
Add r7, sp, #16 ;保存寄存器指针
LDR sp, =IRQStack ;FIQ_STACK
mrs r1, SPSR ;得到暂停的SPR
orr r1, r1, #0xC0 ;
- 最新文章
- Shell脚本 实现vi/cp/mv前自动备份源文件[01-04]
- Shell脚本调试技术[01-04]
- 一步步图解Windows XP操作系统的快速安装[01-04]
- 加密数据文件和EXE文件(一)[01-04]
- 扫出100多个病毒,3个隐身进程(第1版)[01-04]
- NoahWeb™引擎介绍[01-04]
- 相关文章
- PB中如何得到Crosstab中的列名[01-04]
- 判断Windows OS 版本类型的方法[01-04]
- 在PowerBuilder中调用ChooseColor函数[01-04]
- 在PB中如何使用Microsoft Outlook发送邮件[01-04]
- 在C++Builder利用NetBIOS进行编程[01-03]
- 用 C++ Builder 编 Microsoft SQL ..[01-03]
