准备工作
- 一个能正常跑机智云的工程
- 下载好对应的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 *)¤tDataPoint);//协议处理
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()给调度器上锁,发送期间不能因调度被打断。