6961|16

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

helper2416_rtos移植相关_漫谈 [复制链接]

好吧,通过这几天的努力终于可以写一点关于裸机的东西了,raw-os的包还是蛮大的不太适合我这种零基础的学习,纯粹为了学习这里使用ucosii移植的原始包来学习,其实raw-os移植也有参考这份代码的吧。后面有机会再去学习一下raw-os咯,搞懂了移植才不会有问题,当然了我还是希望后面有机会去移植FreeRTOS,毕竟这款我已经使用好久了,相对熟悉些。在分析uCOSII移植的过程中比对过raw-os感觉和freertos很类似,比如说这个函数raw_start_first_task,熟悉的人会知道freertos也有类似的porting接口vPortStartFirstTask。好了不多说了开始我的分析吧,还是有点东西的建议大家好好看看,也算是初学者教程吧。

首先我们简单看下启动的过程:

1)start.S文件中程序段定义
  1. ;-------------------------------------------------------------------------------
  2. ; 程序起始段定义RESET
  3. ;-------------------------------------------------------------------------------
  4.         PRESERVE8                                                        ;字节对齐
  5.         CODE32                                                                ;ARM代码
  6.         AREA RESET,CODE,READONLY                        ;reset名,代码段,只读
  7.         ENTRY                                                            ;程序入口
  8.         b HANDLE_ResetInit                
  9.        
复制代码

2)分散加载描述文件
如果有Scatter file则链接器不会生成类似|Image$$RW_RAM1$$ZI$$XXXX|的符号,这些可以在MDK中设置

这里可以使用它的设置,这样可以使用如下的方式导入符号,具体的可以参考start.S中的InitRORWZI初始化。
  1. IMPORT |Image$RW_RAM1$ZI$Base|
  2.         IMPORT |Image$RW_RAM1$ZI$Limit|
复制代码


好了这里重点说一下分散加载文件S3C2416.srt,在MDK如下地方添加


文件内容如下
  1. LR_ROM1 0x30800000 0x2800000 {                    ; load region size_region
  2.         RW_ROM1 0x30800000 0x2800000  {          ; load address = execution address
  3.                 *.o (RESET, +First)
  4.                 .ANY (+RO +RW)
  5.   
  6.         }
  7.         RW_RAM1 0x33000000 0x1000000  {  
  8.                 .ANY(+ZI)
  9.         }
  10.   
  11. }
复制代码
注意这里的RESET符号,当然了起始地址是0x30800000,所以我们需要把bin文件加载到这个位置然后go这个地址就可以run了。
你可以修改这个,不过还有一些别的需要注意的。

3)HANDLER_ResetInit函数

  1. ;-------------------------------------------------------------------------------
  2. ; 复位初始化
  3. ;-------------------------------------------------------------------------------
  4. HANDLE_ResetInit

  5.         mrc p15,0,r0,c1,c0,0
  6.         ; disable MMU
  7.         ldr        r1,=~(R1_M :OR R1_I :OR R1_C :OR R1_W)          
  8.         and        r0,r0,r1
  9.         mcr p15,0,r0,c1,c0,0

  10.         mov r0, #0
  11.         ; invalidate I,D caches on v4
  12.         mcr p15, 0, r0, c7, c7
  13.         ; drain write buffer on v4
  14.         mcr p15, 0, r0, c7, c10, 4
  15.         ; invalidate I,D TLBs on v4
  16.         mcr p15, 0, r0, c8, c7

  17.         ; svc mode
  18.         mov r1, #0xd3               
  19.         msr        cpsr_cxsf,r1
  20.         ldr        sp,=0x33fe4000
  21.        
  22.         ; set to high vector address
  23.         ; read c1 to r5
  24.         MRC p15,0,r5,c1,c0,0
  25.        
  26.         ; set bit 13 of c1
  27.         orr        r5, r5, #0x2000
  28.        
  29.         ; write r5 to c1
  30.         mcr        p15, 0, r5, c1, c0, 0

  31.         ;---------------------------
  32.         ; disable the watchdog timer.
  33.         ;---------------------------
  34.        
  35.         ldr                r0, =WTCON
  36.         mov                r1, #0
  37.         str                r1, [r0]

  38.         ;---------------------------
  39.         ; Interrupt configuration.
  40.         ;---------------------------
  41.        
  42.         ; mask all first-level interrupts.
  43.         ldr        r0, =INTMSK      
  44.         ldr        r1, =0xffffffff
  45.         str        r1, [r0]

  46.         ; mask all second-level interrupts.
  47.         ldr        r0, =INTSUBMSK   
  48.         ldr        r1, =0xffffffff
  49.         str        r1, [r0]
  50.        
  51. <b><font color="#ff0000">        bl make_mmu_table</font></b>

  52.         ; MMU page table
  53. <b><font color="#ff0000">        ldr r1,=0x30100000</font></b>
  54.         mcr        p15, 0, r1, c2, c0, 0

  55.         ; MMU_SetDomain
  56.            ldr                r0,=0x55555555
  57.            mcr         p15,0,r0,c3,c0,0
  58.                
  59.         ; MMU_SetProcessId
  60.            ldr         r0,=0
  61.            mcr         p15,0,r0,c13,c0,0
  62.              
  63.         ; MMU_Enable
  64.           ldr         r1, =(R1_M :OR R1_I :OR R1_C :OR R1_W :OR R1_V:OR R1_iA:OR R1_nF)
  65.            mrc         p15,0,r0,c1,c0,0
  66.            orr         r0,r0,r1
  67.            mcr         p15,0,r0,c1,c0,0
  68.         nop
  69.         nop          
  70. <font color="#ff0000"><b>        ldr                pc,=Virtual_Start</b></font>
  71.         nop
  72.         nop

复制代码
注意我上面标红的三个地方,下面我们一个个分析。

4)make_mmu_table
  1. /**
  2. * @brief  make_mmu_table
  3. * @note   mmu表初始化
  4. * @param  none
  5. * @retval none
  6. */

  7. void make_mmu_table(void)
  8. {
  9.         int i;
  10.        
  11.         unsigned int *addr = (unsigned int *)MMU_PAGE_TABLE_START;

  12.        
  13.         /* 虚地址0x00000000-0x30000000映射到0x00000000-0x30000000 */
  14.         for ( i=(MMU_IO_AREA_START>>20); i<(MMU_MEM_AREA_START_3>>20); i++ ) {
  15.                
  16.                 addr[i] = SECTION_ENTRY(i,1,1,0,0);
  17.         }
  18.        
  19.        
  20.         /*
  21.                 1)WRITE THROUGH
  22.                 CPU向CACHE写入数据时,同时向MEMORY也写一份,使CACHE和MEMORY的数据保持一致.
  23.                 优点是简单,缺点是每次都要访问MEMORY速度比较慢.

  24.                 2)POST WRITE
  25.                 CPU更新CACHE数据时,把更新的数据写入到一个更新缓冲器,在合适的时候才对MEMORY进行更新.
  26.                 这样可以提高CACHE访问速度,但是在数据连续被更新两次以上的时候,缓冲区将不够使用,被迫同时更新MEMORY.

  27.                 3)WRITE BACK
  28.                 CPU更新CACHE时,只是把更新的CACHE区标记一下,并不同步更新MEMORY.
  29.                 只是在CACHE区要被新进入的数据取代时才更新MEMORY,考虑到很多时候CACHE存入的是中间结果,没有必要同步更新MEMORY.
  30.                 优点是CPU执行的效率提高,缺点是实现起来技术比较复杂.
  31.         */
  32.        
  33.         /* 映射WRITE BACK CACHE从0x30000000-0x33800000 */
  34.         for ( i=(MMU_MEM_AREA_START_3>>20); i<(LCD_DMA_BUFFER_PA_BASE >> 20); i++ ) {
  35.                        
  36.                 addr[i] = SECTION_ENTRY_CACHE(i,0,1,1,1,1);       
  37.         }


  38.         /* 映射WRITE THROUGH CACHE从0x33800000-0x33b00000 */
  39.         for ( i=(LCD_DMA_BUFFER_PA_BASE>>20); i<(LCD_DMA_BUFFER_PA_END >> 20); i++ ) {

  40.                 addr[i] = SECTION_ENTRY_CACHE(i,0,1,1,1,0);
  41.         }


  42.         /* 地址0x33b00000-0x34000000未被作为CACHE使用,可用于硬件DMA */
  43.         for ( i=(LCD_DMA_BUFFER_PA_END>>20); i<(MMU_MEM_AREA_START_3_4 >> 20); i++ ) {
  44.                
  45.                 addr[i] = SECTION_ENTRY_CACHE(i,0,1,1,0,0);
  46.         }


  47.        
  48.         /* 虚地址0x34000000-0x60000000映射到0x34000000-0x60000000 */
  49.         for ( i=(MMU_MEM_AREA_START_3_4>>20); i<(MMU_RESERVED1_START>>20); i++ ) {
  50.                
  51.                 addr[i] = SECTION_ENTRY(i,1,1,0,0);
  52.         }

  53.        
  54.        
  55.         /* 虚地址0x60000000-0xc0000000禁止访问 */
  56.         for ( i=(MMU_RESERVED1_START>>20); i<(MMU_MEM_AREA_START>>20); i++ ) {
  57.                
  58.                 addr[i] = 0x00000000;
  59.         }

  60.        
  61.        
  62.         /* 系统内存被映射到0xc0000000-0xc4000000 */
  63.         for ( i=(MMU_MEM_AREA_START>>20); i<(MMU_RESERVED2_START>>20); i++ ) {
  64.                
  65.                 addr[i] = SECTION_ENTRY((i-((MMU_MEM_AREA_START>>20)-(MMU_MEM_AREA_START_3>>20))),1,1,0,0);
  66.         }

  67.        
  68.        
  69.         /* 虚地址0xc4000000-0xffff0000禁止访问,虚地址0xffff0000-0xffffffff映射到0x30000000-0x300fffff */
  70.         for ( i=(MMU_RESERVED2_START>>20); i<0x1000; i++ ) {

  71.         #if ENABLE_EXCEPTION_MMU
  72.                 if ( i >= (MMU_EXCEPTION_START >> 20) ) {
  73.                         addr[i] = SECTION_ENTRY( (i-((MMU_EXCEPTION_START>>20)-(MMU_PHYSICAL_EXCEPTION_START>>20))), 1, 1, 0, 0);
  74.                 } else {
  75.                         /* 禁止访问 */
  76.                         addr[i] = 0x00000000;
  77.                 }
  78.         #else
  79.                         if ( i == (MMU_EXCEPTION_START >> 20) ) {
  80.                         addr[i] = SECTION_ENTRY( (i-((MMU_EXCEPTION_START>>20)-(MMU_PHYSICAL_EXCEPTION_START>>20))), 1, 1, 0, 0);
  81.                         break;
  82.                 } else {
  83.                         /* 禁止访问 */
  84.                         addr[i] = 0x00000000;
  85.                 }
  86.         #endif
  87.         }
  88.        
  89. }
复制代码
这个我就不文字分析了,看我上面的描述,这个地方可以参考三个文字,如下

/*
NOTE:
        http://blog.sina.com.cn/s/blog_9447904001015h38.html
        http://www.it165.net/embed/html/201408/2633.html
       
        DDI0198E_arm926ejs_r0p5_trm.pdf
*/


注意红色的这个,这是最好的最有根据的,ARM官方926技术手册。


这里在啰嗦一下,我看玩raw-os下面的描述真的不太理解,看了很多资料才明白的,可以参考上面的网址。
其实需要理解以下两个函数

  1. #define SECTION_ENTRY(base, ap, d, c, b)                                 \
  2.         ((base << 20)|(ap<<10)|(d<<5)|(1<<4)|(c<<3)|(b<<2)|(1<<1))


  3. #define SECTION_ENTRY_CACHE(base, tex, ap, d, c, b)         \
  4.         ((base << 20)|(tex << 12)|(ap<<10)|(d<<5)|(1<<4)|(c<<3)|(b<<2)|(1<<1))
复制代码
注意可以对比uboot中的汇编代码来理解,主要依据是DDI0198E_arm926ejs_r0p5_trm.pdf


我简单的说说吧:
  1. 1、针对SECTION_ENTRY,ap是控制访问权限,读写啊用户啊这些,后面三个一般d=1 ,c=0 ,b=0,细节参考那个文档吧。
  2. 2、针对SECTION_ENTRY_CACHE,ap是控制访问权限
  3. 1)后面d=1,c=1,b=1表示映射WRITE BACK CACHE
  4. 2)后面d=1,c=1,b=0表示映射WRITE THROUGH CACHE
  5. 3)后面d=1,c=0,b=0表示未被作为CACHE使用
复制代码


好了最终是这样的如下描述
  1. /*
  2.         虚地址0x00000000-0x30000000映射到0x00000000-0x30000000
  3.         虚地址0x34000000-0x60000000映射到0x34000000-0x60000000
  4.         虚地址0xc0000000-0xc4000000映射到0x30000000-0x34000000
  5.         虚地址0x60000000-0xc0000000禁止访问
  6.         虚地址0xc4000000-0xffff0000禁止访问
  7.         虚地址0xffff0000-0xffffffff映射到0x30000000-0x30100000
  8.        
  9.         0x30000000-0x30100000---异常向量表使用
  10.         0x30100000-0x30200000---MMU的PAGE_TABLE使用
  11.         0x33800000-0x33b00000---LCD的DMA缓冲使用
  12.         0x33b00000-0x34000000---CACHE没有打开供给外设DMA使用
  13.         0x30200000-0x30800000---可用于堆栈
  14. */
复制代码
说道堆栈,我想说还需要自行实现malloc,可以在前面的分散加载文件S3C2416.srt中添加heap相关的,需要进一步熟悉srt的语法。后面我会实现分享给大家,当然raw-os作者的做法也不错,值得学习。


注意并不是0x00000000-0x60000000的虚地址和硬件地址是一一映射的中间有个断层,也就是DRAM的区间0x30000000-0x34000000


好了看完MMU映射后我们继续看,后面的第二个红色,指定这个table在0x30100000这个地址。


继续看下去到虚拟启动。


5)Virtual_Start
  1. ;-------------------------------------------------------------------------------
  2. ; 虚拟启动
  3. ;-------------------------------------------------------------------------------
  4. Virtual_Start

  5.         nop
  6.         nop
  7.         nop
  8.         nop

  9.         ;FIQ mode
  10.         mov r1, #0x11                       
  11.         msr                cpsr_cxsf,r1
  12.         ldr                sp,=0x30200000
  13.        
  14.         ;IRQ mode
  15.         mov r1, #0x12                       
  16.         msr                cpsr_cxsf,r1
  17.         ldr                sp,=0x301fc000

  18.         ;SYS mode
  19.         mov r1, #0x1f                       
  20.         msr                cpsr_cxsf,r1
  21.         ldr                sp,=0x301f8000       
  22.                
  23.         ;ABT mode
  24.         mov r1, #0x17                       
  25.         msr                cpsr_cxsf,r1
  26.         ldr                sp,=0x301f4000

  27.         ;UDF mode
  28.         mov r1, #0x1b                       
  29.         msr                cpsr_cxsf,r1
  30.         ldr                sp,=0x301f0000
  31.        
  32.         ;SVC mode
  33.         mov r1, #0xd3                       
  34.         msr                cpsr_cxsf,r1
  35.         ldr                sp,=0x301ec000

  36.         BL InitRORWZI
  37.        
  38. <b><font color="#ff0000">        LDR PC,=rtos_main</font></b>

  39. LOOP
  40.         b                 LOOP
复制代码
注意看这里跳转到c程序的main,注意我测试的结果是不能使用标准的main作为名称,会有报错的,可以使用大写Main来替代。

6)exception_vector

  1. ;-------------------------------------------------------------------------------
  2. ; 异常向量表
  3. ;-------------------------------------------------------------------------------
  4. exception_vector
  5.         LDR PC,=reset_exception_process                         ;复位异常
  6.         LDR PC,=undef_exception_process_asm                        ;未定义指令异常
  7.         LDR PC,=swi_exception_process                                ;软中断异常
  8.         LDR PC,=pabort_exception_process                        ;取指中止异常
  9.         LDR PC,=dabort_exception_process                        ;数据中止异常
  10.         LDR PC,.                                                                        ;保留
  11. <b><font color="#ff0000">        LDR PC,=OS_CPU_IRQ_ISR                                                ;保留</font></b>
  12.         LDR PC,=fiq_exception_process                                ;FIQ中断异常
复制代码
注意看红色这句需要指向我RTOS的中断函数。


  1. ;*******************************************************************************
  2. ; OS_CPU_IRQ_ISR
  3. ;*******************************************************************************
  4. OS_CPU_IRQ_ISR
  5.         STMFD        SP!, {R1-R3}
  6.         MOV        R1, SP
  7.         ADD        SP, SP, #12
  8.         SUB        R2, LR, #4
  9.         MRS        R3, SPSR
  10.         MSR        CPSR_cxsf, #SVCMODE:OR:NOINT
  11.         ;//take care! this sp is not the one before!svc mode's SP
  12.         STMFD        SP!, {R2}
  13.         STMFD        SP!, {R4-R12, LR}

  14.         LDMFD        R1!, {R4-R6}
  15.         STMFD        SP!, {R4-R6}
  16.         STMFD        SP!, {R0}

  17.         STMFD        SP!, {R3}

  18.         LDR        R4, =OSTCBCur
  19.         LDR        R5, [R4]
  20.         LDR        SP, [R5]

  21.         BL        OSIntEnter

  22.         MSR        CPSR_c, #IRQMODE:OR:NOINT
  23. <b><font color="#ff0000">         BL        irq_process
  24. </font></b>
  25.         MSR        CPSR_c, #SVCMODE:OR:NOINT
  26.         BL        OSIntExit

  27.         LDMFD        SP!, {R4}
  28.         MSR        SPSR_cxsf, R4
  29.         LDMFD        SP!, {R0-R12, LR, PC}^
  30.        
  31.        
复制代码

这里红色的地方会跳转到当前的中断位置,算是用户中断管理吧,uCOSII不太熟悉,不知道是否有OS级别中断和非OS级别中断,FreeRTOS是有一个宏定义的数值来控制的,体会起来挺复杂的。


7)rtos_main
  1. /**
  2. * @brief  rtos_main
  3. * @note   óû§Ö÷3ìDò
  4. * @param  none
  5. * @retval none
  6. */
  7. int rtos_main(void)
  8. {
  9.         inerrupt_vector_init();
  10.         memcpy( (void *)0xffff0000, (void *)(exception_vector), 128 );

  11.         MMU_EnableDCache();
  12.         MMU_EnableICache();       
  13.        
  14.         OSInit();
  15.         InitTask();
  16.         OSStart();  
  17.        
  18.         while(1);
  19. }
复制代码
终于到了我们的main了,注意需要把start.S中的exception_vector拷贝到我们指定的位置0xffff0000-0xffffffff(注意这个虚地址对应我们的DRAM起始地址处0x30000000-0x30100000)。




8)定时器初始化,用于系统节拍

  1. /**
  2. * @brief  TIMER0_Init
  3. * @note   TIMER0初始化
  4. * @param  none
  5. * @retval none
  6. */
  7. void TIMER0_Init(void)
  8. {
  9.         /*
  10.          * TIMER INPUT_CLK = PCLK/{Precaler+1}/{Divider_Value}
  11.          *
  12.          * TIMER INPUT_CLK = PCLK/(15+1)/4 = PCLK/64
  13.          *
  14.          * TCNTB0_REG = INPUT_CLK/OS_TICKS_PER_SEC = get_PCLK()/(64*OS_TICKS_PER_SEC)
  15.          */
  16.        
  17.        
  18.         /* 使用TIMER0前,清除相关配置 */
  19.         TCON_REG  &= ~0x0F;                       
  20.         TCFG0_REG &= ~0xFF;               
  21.         TCFG1_REG &= ~0x0F;

  22.         TIMER0_ISR_Init();

  23.         register_irq(10, TIMER0_ISR_Service);
  24.        
  25.         /* TIMER0_Prescaler=15 */
  26.         TCFG0_REG |= 15;       
  27.        
  28.         /* TIMER0_Divider_Value=1/4 */       
  29.         TCFG1_REG |= 0x01;                       
  30.         TCNTB0_REG = get_PCLK()/(64*OS_TICKS_PER_SEC);

  31.         /* 更新TCNTB0&TCMPB0 */
  32.         TCON_REG |= 0x02;       
  33.        
  34.         /* 手动更新位必须在下次写前清除 */       
  35.         TCON_REG &= ~0x02;       
  36.        
  37.         /* 自动重装,启动定时器 */       
  38.         TCON_REG |= 0x09;       
  39.        
  40. }
复制代码
这里我想说一下这个,关于TCNTB0寄存器的设置,应该是按照我的方式设置,也许我是错的,希望大家指出,当然了raw-os的作者也不是这样的和原版本的uCOSII一样。

最后大家简单看下我的platform.h头文件吧,不是别的,希望大家的态度积极认真一些,对自己真的很有帮助,虽然我的代码很多参考别人或者来自他人,但是对于这些代码要有根有据,自己能说服自己也是好的,当然我也喜欢用自己的代码格式来排版他们,看着舒服,愿意一点点的维护他们,他们很美好。

  1. /**
  2. *******************************************************************************
  3. * @file       platform.h
  4. * @author     camel.shoko
  5. * @version    v1.1
  6. * @date       2014/08/20
  7. * @brief      平台相关定义
  8. * @copyright  camel.shoko@gmail.com
  9. *******************************************************************************
  10. */


  11. #ifndef PLATFORM_H_
  12. #define PLATFORM_H_

  13. /* Includes ------------------------------------------------------------------*/
  14. #include "stdlib.h"
  15. #include "2416_reg.h"

  16. #include "os_cfg.h"
  17. #include "ucos_ii.h"


  18. /* Defines -------------------------------------------------------------------*/

  19. /* 小端模式 */
  20. #define LITTELE_ENDIAN                                                                         1                                                      

  21. /* 软件版本定义1.10 */
  22. #define VER_MAJOR                                                            1
  23. #define VER_MINOR                                                            1
  24. #define VER_PATCH                                                              0

  25. #define S3C2416_ARM926_PORT                                                                1
  26. #define USE_STDARG_PRINTF                                                                1
  27. #define ENALBE_IAR_LIB_PRINT                                                        0


  28. /* Macros --------------------------------------------------------------------*/

  29. /* 调度器和协程 */
  30. #ifdef CRTHREAD_SCHED
  31.         #define MAX_CRTHREAD                                            10
  32. #endif


  33. /* 硬件平台PORTING */
  34. #if S3C2416_ARM926_PORT
  35.         #define UCOSII_RTOS_PORTING                                                        1  
  36. #endif


  37. /* 指定调试方法 */
  38. #if USE_IAR_LIB_PRINTF == 1
  39.         #define ENALBE_IAR_LIB_PRINT                                                1
  40.         #define ENABLE_STDARG_PRINTF                                                0
  41. #elif USE_STDARG_PRINTF == 1
  42.         #define ENALBE_IAR_LIB_PRINT                                                0
  43.         #define ENABLE_STDARG_PRINTF                                                1
  44. #else
  45.         #error "You must define the printf method!"
  46. #endif

  47. #if ENABLE_STDARG_PRINTF
  48.     #include "printf_stdarg.h"
  49. #endif


  50. #define _STR(x)                                                              #x
  51. #define STR(x)                                                               _STR(x)
  52. #define VERSION                                                              STR(VER_MAJOR)"."STR(VER_MINOR)"."STR(VER_PATCH)



  53. #ifdef __cplusplus
  54.     #define DECLARE_EXTERN_C_BEGIN                                     extern "C" {
  55.     #define DECLARE_EXTERN_C_END                                      }
  56. #else
  57.     #define DECLARE_EXTERN_C_BEGIN
  58.     #define DECLARE_EXTERN_C_END
  59. #endif


  60. #ifndef NULL
  61.         #ifdef __cplusplus
  62.                 #define NULL                                                                         ( 0 )
  63.         #else
  64.                 #define NULL                                                                         ( (void *)0 )
  65.         #endif
  66. #endif


  67. #if defined(DEBUG) || defined(_DEBUG)
  68.     #define DEBUG(x)                                                               my_printf(x"\r\n")
  69.     #define DEBUGN(x)                                   my_printf(x)
  70.     #define DEBUG0(x)                                   my_printf(x"\r\n")
  71.     #define DEBUG1(x, y)                                                           my_printf(x"\r\n", y)
  72.     #define DEBUG2(x, y, z)                                                        my_printf(x"\r\n", y, z)
  73.     #define DEBUG3(x, y, z, a)                                                     my_printf(x"\r\n", y, z, a)
  74.     #define DEBUG4(x, y, z, a, b)                                                 my_printf(x"\r\n", y, z, a, b)
  75.     #define DEBUG_HEX(pData, nLen)                                \
  76.     do                                                         \
  77.     {                                                          \
  78.         int i = 0, len = nLen;                                 \
  79.         uint8_t *pByte = (uint8_t *)pData;                   \
  80.         for (; i<len; i++)                                     \
  81.         {                                                      \
  82.             my_printf("%02X ", pByte[i]);                                  \
  83.         }                                                      \
  84.         my_printf("\r\n");                                             \
  85.         }                                                                                  \
  86.     while (0);
  87. #else
  88.     #define DEBUG(x)
  89.     #define DEBUG0(x)
  90.     #define DEBUGN(x)
  91.     #define DEBUG1(x, y)
  92.     #define DEBUG2(x, y, z)
  93.     #define DEBUG3(x, y, z, a)
  94.     #define DEBUG4(x, y, z, a, b)
  95.     #define DEBUG_HEX(pData, nLen)
  96. #endif


  97.                
  98. #if LITTELE_ENDIAN
  99.     #define SWAP16(A)                                                     ((((WORD)(A) & 0xFF00) >> 8) | (((WORD)(A) & 0x00FF) << 8) )
  100.    
  101.     #define SWAP32(A)                                                     \
  102.        ((((DWORD)(A) & 0xff000000) >> 24) |                 \
  103.         (((DWORD)(A) & 0x00ff0000) >> 8)  |                   \
  104.         (((DWORD)(A) & 0x0000ff00) << 8)  |                   \
  105.         (((DWORD)(A) & 0x000000ff) << 24))
  106. #else
  107.     #define SWAP16(A)                                                     ( A )
  108.     #define SWAP32(A)                                                     ( A )
  109. #endif
  110.    
  111.    
  112. <font color="#0000ff">#if UCOSII_RTOS_PORTING
  113.         #define msleep(ms)                                                                        OSTimeDly((1000*ms)/OS_TICKS_PER_SEC)
  114. #endif</font>


  115. /* Global Function Prototype -------------------------------------------------*/
  116. extern void MMU_EnableDCache(void);
  117. extern void MMU_EnableICache(void);
  118. extern void exception_vector(void);



  119. #endif /*PLATFORM_H_*/

  120. /****************** (C) COPYRIGHT 2013 Camle.shoko ***********END OF FILE******/
复制代码


哈哈,吐槽一下,我在移植uCOSII的时候,测试中使用OSTimeDly我以为是ms为单位的呢,结果是时间不准,我还以为是系统tick有问题呢,太久没用ucos都忘了是多少个系统tick时间的含义。用惯了freertos了,他vTaskDelay就是实际的多久时间,这里我也添加了个宏,便于使用,可参考上面蓝色部分宏定义。





测试程序:
  1. /**
  2. * @brief  Task1
  3. * @note   任务1
  4. * @param  none
  5. * @retval none
  6. */
  7. static void Task1(void *parg)
  8. {
  9.         (void) parg;

  10.         while (1) {
  11.                 DEBUG("# DELAY-TASK");
  12.                 OSTimeDly(100);       
  13.         }       
  14. }


  15. /**
  16. * @brief  Task2
  17. * @note   任务2
  18. * @param  none
  19. * @retval none
  20. */
  21. static void Task2(void *parg)
  22. {
  23.         (void) parg;
  24.        
  25.         /* 设置GPB1引脚为输出 */
  26.         GPBCON_REG = 0x00000004;               
  27.        
  28.         while (1) {
  29.                 DEBUG("# BLINK-TASK");
  30.                
  31.                 /* 设置GPB1输出低电平 */
  32.                 GPBDAT_REG = 0x00000000;           
  33.                 OSTimeDly(100);
  34.                
  35.                 /* 设置GPB1输出高电平 */
  36.                 GPBDAT_REG = 0x00000002;           
  37.                 OSTimeDly(100);
  38.         }
  39. }


  40. /**
  41. * @brief  InitTask
  42. * @note   初始化任务
  43. * @param  none
  44. * @retval none
  45. */
  46. void InitTask(void)
  47. {

  48.         //初始化代码段
  49.         TIMER0_Init();
  50.         UART0_Init();
  51.        
  52.         //任务创建
  53.         OSTaskCreate(Task1, (void *)1, (void *)&Task1Stk[1023], 4);
  54.         OSTaskCreate(Task2, (void *)2, (void *)&Task2Stk[1023], 8);       
  55. }
复制代码


后面会完善malloc的实现,添加其他组件网络部分和文件系统为主,期待和大家分享。


最新回复

现arm9处境有点困境了,跑系统上有A系列arm9不如,跑rtos下有M系列ARM9不如,就现在新产品案子几家常用的mcu供应商都不推荐arm9了   详情 回复 发表于 2014-9-11 09:38

赞赏

1

查看全部赞赏

点赞 关注
个人签名电工

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
消灭0回复,我自己

 
个人签名电工
 

回复

255

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
好东西  楼主辛苦啦
 
 
 

回复

2万

帖子

74

TA的资源

管理员

4
 
呵呵  不错  继续加油
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

添加代码的那个中能改颜色吗  详情 回复 发表于 2014-8-21 12:08
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
soso 发表于 2014-8-21 10:26
呵呵  不错  继续加油

  
添加代码的那个<>中能改颜色吗
 
个人签名电工
 
 

回复

554

帖子

0

TA的资源

版主

6
 
添加代码之后可以手动更改颜色。。。

点评

我昨天发的帖子显示的这样的。。。 [*] LDR PC,=rtos_main 不知道哪里出了问题啊,我先用添加的代码 然后选中代码使用B A 修改粗细和颜色的  详情 回复 发表于 2014-8-21 12:51
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

7
 
spacexplorer 发表于 2014-8-21 12:24
添加代码之后可以手动更改颜色。。。

我昨天发的帖子显示的这样的。。。
  •         LDR PC,=rtos_main



不知道哪里出了问题啊,我先用<>添加的代码 然后选中代码使用B A 修改粗细和颜色的


 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

8
 
上传两个文档
分散加载描述文件指定堆和栈




DDI0198E_arm926ejs_r0p5_trm.pdf (1.43 MB, 下载次数: 1)

MDK开发--使用分散加载文件.pdf (5.17 MB, 下载次数: 1)
DDI0198E_arm926ejs_r0p5_trm.pdf (1.43 MB, 下载次数: 1)
MDK开发--使用分散加载文件.pdf (5.17 MB, 下载次数: 1)

 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

9
 
再分享一个文章,值得参考

http://wenku.baidu.com/view/0073990dba1aa8114431d9ad.html
 
个人签名电工
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

10
 
支持,期待FreeRTOS版本的

点评

惭愧啊,转向rawos了,freeRTOS版本后面有机会一定移植到2416上,感觉国内这几年要流行在ram9+上面跑rtos了 好时候来了,大家加油。  详情 回复 发表于 2014-9-10 22:58
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

11
 
ou513 发表于 2014-8-22 08:17
支持,期待FreeRTOS版本的

惭愧啊,转向rawos了,freeRTOS版本后面有机会一定移植到2416上,感觉国内这几年要流行在ram9+上面跑rtos了

好时候来了,大家加油。

点评

其实ARM9 + rtos感觉用的还是比较少,在目前M3、M4的主流下更少少了  详情 回复 发表于 2014-9-10 23:34
 
个人签名电工
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

12
 
lyzhangxiang 发表于 2014-9-10 22:58
惭愧啊,转向rawos了,freeRTOS版本后面有机会一定移植到2416上,感觉国内这几年要流行在ram9+上面跑rtos ...

其实ARM9 + rtos感觉用的还是比较少,在目前M3、M4的主流下更少少了

点评

很多场合M3/M4真的是吃力不讨好,扩sdram+flash成本也不低,普通应用还没什么问题。  详情 回复 发表于 2014-9-11 08:30
 
 
 

回复

554

帖子

0

TA的资源

版主

13
 
主要是看难度,如果大家一起努力,把难度降低了,使用的人会越来越多!

点评

是的,国外很多年了都是rtos+arm9+ 国内会慢慢流行起来的,我相信  详情 回复 发表于 2014-9-11 08:31
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

14
 
ou513 发表于 2014-9-10 23:34
其实ARM9 + rtos感觉用的还是比较少,在目前M3、M4的主流下更少少了

很多场合M3/M4真的是吃力不讨好,扩sdram+flash成本也不低,普通应用还没什么问题。
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

15
 
spacexplorer 发表于 2014-9-11 00:48
主要是看难度,如果大家一起努力,把难度降低了,使用的人会越来越多!

是的,国外很多年了都是rtos+arm9+

国内会慢慢流行起来的,我相信

点评

现arm9处境有点困境了,跑系统上有A系列arm9不如,跑rtos下有M系列ARM9不如,就现在新产品案子几家常用的mcu供应商都不推荐arm9了  详情 回复 发表于 2014-9-11 09:38
 
个人签名电工
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

16
 
lyzhangxiang 发表于 2014-9-11 08:31
是的,国外很多年了都是rtos+arm9+

国内会慢慢流行起来的,我相信

现arm9处境有点困境了,跑系统上有A系列arm9不如,跑rtos下有M系列ARM9不如,就现在新产品案子几家常用的mcu供应商都不推荐arm9了

点评

M3很多场合rtos还是有点吃力,我很多应用,内存都不够,需要扩展 其次如果有存储,稍微苛刻一点的应用都不行,要均衡,掉电保护等  详情 回复 发表于 2014-9-11 10:07
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

17
 
ou513 发表于 2014-9-11 09:38
现arm9处境有点困境了,跑系统上有A系列arm9不如,跑rtos下有M系列ARM9不如,就现在新产品案子几家常用的 ...

M3很多场合rtos还是有点吃力,我很多应用,内存都不够,需要扩展
其次如果有存储,稍微苛刻一点的应用都不行,要均衡,掉电保护等
 
个人签名电工
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表