原创 ucos-ii for pic32的一点认识

2010-5-4 22:51 5540 7 7 分类: MCU/ 嵌入式
    前些日子从某网站上下载了micrium公司在PIC32MX360平台下移植的uCOS-II操作系统代码,因对uCOS有一定兴趣,就对其中的部分代码做了一点程序设计总结,主要涉及到了了crt0.s以及BSP.C以及OS_CPU_A.s三个源文件。
    第一:CPU初始化(crt0.s)
    程序执行总是从crt0.s文件的reset开始的,包括由于NMI,Soft Reset等引起的复位操作,基本的执行过程可参照MPLAB C32 Compiler编译器手册。
    复位发生后,
    Step 1:被初始化的寄存器为堆栈软指针寄存器SP,在整个工程没有RAM函数的情况下,SP指向kseg1_data_ram的最高地址,否则,SP以上为RAM函数空间。可以看出,PIC32的堆栈方向是递减的。具体操作详见elf32pic32mx.xn文件476行-507行之间代码。
    Step 2:个被初始化的寄存器为gp(Global pointer),_gp = ALIGN(16) + 0x7FF0是elf32pic32mx.xn的具体代码,据说是为了便宜对全局变量的寻址,代码的详细含义不大了解,是否可以被换做其他操作如加0x8000呢?
    Step 3:初始化高shadow寄存器组下的gp,同样是为了便宜寻址。
    Step 4:调用_on_reset弱函数,可以重新定义该函数,执行某些有意义的操作。
    Step 5:未初始化的全局变量填充为0。在这部分,个人觉得代码存在错误。_bss_init标志符下,每次填充字节量为16个,然后判断_bss_end变量范围,而_bss_end变量是四个字节对齐的,具体代码为elf32pic32mx.xn的466行. = ALIGN(32 / 8),存在越界初始化的嫌疑。
    Step 6:初始化需初始化化的全局变量。过程同上,只不过源数据固化在kseg0_program_mem中,一般都具有特定的意义。
    Step 7:初始化RAM函数。同六一样,因为RAM的数据掉电易失性,源数据固化在flash中。
    Step 8:初始化BMXDKPBA,BMXDUDBA,BMXDUPBA三个寄存器。奇怪为什么没有初始化BMXPUPBA,而BMXDUPBA为RAM的最大值,想来是uCOS不准备划分user区,只备kseg0与kseg1两个kernel空间了。
    Step 9:初始化几个CP0寄存器,完成以下功能:
    1)明确exception基地址:_ebase_address= 0x9FC01000;见prodefs.ld文件。
    2)设定中断向量存储字节数。
    3)设定众多中断向量的基地址为_ebase_address+0x200,与syscall等指令产生异常处理区分开。
    4)初始化Status.CEE位。这一步好像没有多大必要,没发现CPU支持这个。
    Step 10:调用_on_bootstrap弱函数,同步骤4.
    Step 11:清楚BEV位(复位自然BEV置为)调用main函数,系统进入NORMAL状态。
    第二:操作系统初始化
    第一步完成后,CPU处于中断禁止状态,需要为ucos操作系统的运行提供资源支持。主要包括信号量、列表、任务控制块、事件,栈等,这部分基本与硬件无关。
    第三:创建任务,由调度器调度执行该函数AppTaskStart()
    这个可以算作其他任务的父进程了,在该函数中,板级的运行环境建立起来(通过调用BSP_InitIO,实现了对板级环境的初始化,以及板级所需资源的分配)。同时,该任务还创建了子任务:AppTask1(仅仅起到延迟的作用)。以上是ucos-ii与任务结合的一个思路,当然还可以通过其他种方式实现,如直接在main函数中调用生成任务。需要提起注意的是,PIC32任务间的切换采用了syscall指令,
    #define  OS_TASK_SW()     asm volatile("syscall");见os_cpu.h。
    syscall指令的执行,直接触发产生exception,CPU跳转到下列代码执行OS_CPU_A.s中的任务切换过程。
    .section .gen_handler,"ax",@progbits
    .set noreorder
    .ent _gen_exception
_gen_exception:
    la  k0,OSCtxSw
    jr  k0
    nop  
    .end _gen_exception
    以上见crt0.s。
    在OS_CPU_A.s文件中有移植后的任务切换代码,上下文的保存过程着实很耗时间。按照最佳性能,每个指令都是流水线单时钟周期运行,上下文切换时间至少为Cycle*64,差不多为um级了,看来任务切换的设计需要仔细斟酌才能发挥PIC32的最佳性能。
    

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条