UCOSIII+机智云协议的移植笔记

准备工作

  • 一个能正常跑机智云的工程
  • 下载好对应的ucos移植包
  • 将ucos移植到MCU上,并能正常跑LED灯

以上工作漫天的教程…

UCOSIII与机智云的结合

-1、移植是,先知道自己用的MCU是否支持FPU浮点运算,如果支持,在.s文件里面,需要添加一段话:

Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
			
			;从这开始
				 LDR     R0, =SystemInit
                 BLX     R0
				 				 
				 IF {FPU} != "SoftVFP"
                                                ; Enable Floating Point Support at reset for FPU
                 LDR.W   R0, =0xE000ED88         ; Load address of CPACR register
                 LDR     R1, [R0]                ; Read value at CPACR
                 ORR     R1,  R1, #(0xF <<20)    ; Set bits 20-23 to enable CP10 and CP11 coprocessors
                                                ; Write back the modified CPACR value
                 STR     R1, [R0]                ; Wait for store to complete
                 DSB
                
                                                ; Disable automatic FP register content
                                                ; Disable lazy context switch
                 LDR.W   R0, =0xE000EF34         ; Load address to FPCCR register
                 LDR     R1, [R0]
                 AND     R1,  R1, #(0x3FFFFFFF)  ; Clear the LSPEN and ASPEN bits
                 STR     R1, [R0]
                 ISB                             ; Reset pipeline now the FPU is enabled
                 ENDIF
			;到这结束,就上面这段
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

确定好了之后,在有中断的地方,加上中断保护函数:

void TIM7_IRQHandler(void)
{
    OSIntEnter();
    if(__HAL_TIM_GET_FLAG(&htim7, TIM_FLAG_UPDATE) != RESET)
    {
        if(__HAL_TIM_GET_IT_SOURCE(&htim7, TIM_IT_UPDATE) !=RESET)
        {
            __HAL_TIM_CLEAR_IT(&htim7, TIM_IT_UPDATE);
            gizTimerMs();//系统毫秒定时
        }
    }
    OSIntExit();
}

用OSIntEnter()和OSIntExit(),完成之后,单独为机智云创建一个任务

void gizwitsHand_task(void *p_arg)
{   
    p_arg = p_arg;
    OS_ERR err;
    while(1)
    {
      OSSchedLock(&err);
      gizwitsHandle((dataPoint_t *)&currentDataPoint);//协议处理
      userHandle();  
      OSSchedUnlock(&err);
      ucos_delay_ms(500);
    }
}
#define gizwits_task_PRIO                           4
#define gizwits_task_SIZE                           256
OS_TCB  gizwits_task_TCB;
CPU_STK gizwits_task_STK[gizwits_task_SIZE];

void gizwits_task_creat(void)
{
    OS_ERR err;

    OSTaskCreate(&gizwits_task_TCB,
              "gizwits task",
              gizwitsHand_task,
              0,
              gizwits_task_PRIO,
              &gizwits_task_STK[0],
              gizwits_task_SIZE/10,
              gizwits_task_SIZE,
              0,
              20,
              0,
              OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
              &err);
}

完成后,试试?反正我就可以了。
值得注意的是,

#define OS_CFG_OBJ_TYPE_CHK_EN          1u

需要将这个置1。
在gizwitsHandle()这个函数执行时,需要加入OSSchedLock()和OSSchedUnlock()给调度器上锁,发送期间不能因调度被打断。

发布了45 篇原创文章 · 获赞 52 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42312125/article/details/104379794
今日推荐