uCOS-III 을 STM32F407 Discovery board에 올려보자.

uCOS-III 을 STM32F407 Discovery board에 올려보자.


준비물
1. Discovery STM32F407 보드
2. 컴파일러, EWARM 은 6.5이상, MDK는 4.6 이상



1. OS을 다운 받고... V 3.03.01 사용.


LoginSTMicroelectronics STM32F4xx
μC/OS-IIIµC/OS-III V3.03.01STM3240G-Eval
Atollic TrueSTUDIO V3.x
IAR (EWARM) V6.x
Keil MDK V4.x
2013/01/23


2. 시간 낭비 없게 정확한 컴파일러 버젼으로 동일하게 컴파일.



3. STM3240G-Eval은 25Mhz 사용하고 Discovery는 8Mhz사용하니 이 부분 수정.


  3.1  bsp.c 에서 아래 define값을 25에서 8로 수정

       //#define  BSP_BIT_RCC_PLLCFGR_PLLM               25u 

       #define  BSP_BIT_RCC_PLLCFGR_PLLM               8u


  3.2 bsp.c 에서 led관련 port을 discovery에 맞게 수정


  3.3 stm32f4xx.h 에서 8Mhz에 맞게 수정

      //#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */

     #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */



4. 기타 

   이상한게 IAR쪽 os_cpu_c.c 에만 FPU관련 Register 처리 루틴이 들어 있다는거.

   GNU, MDK는 이 부분이 코드에 없음.

  

    FPU관련 Register가 S0~S31까지 총 32개라서 Task Switching시 마다 stack에 push,pop 동작에 로드가 걸릴듯 했지만

    uCOS-III 에서는 영리하게 Task 생성시 해당 Task내에서 FPU사용 여부를 Check하여 FPU Register push,pop 동작을

    Task마다 선택적으로 동작 하도록 설정 되어 있음.


#define  OS_OPT_TASK_NONE               (OS_OPT)(0x0000u)  /* No option selected                                 */

#define  OS_OPT_TASK_STK_CHK          (OS_OPT)(0x0001u)  /* Enable stack checking for the task                 */

#define  OS_OPT_TASK_STK_CLR          (OS_OPT)(0x0002u)  /* Clear the stack when the task is create            */

#define  OS_OPT_TASK_SAVE_FP  (OS_OPT)(0x0004u)  /* Save the contents of any loating-point registers  */

#define  OS_OPT_TASK_NO_TLS                  (OS_OPT)(0x0008u)  /* Specifies the task DOES NOT require TLS support    */