本文使用环境:
主控:W801 (开发板)
兼容:W800 AIR101
一、概述
这篇文章主要记录FreeRtos学习过程中遇到的问题,供自己学习。本着遇到问题解决问题的态度,第二章将会就问题解决问题。
二、问题
1、延时问题-不清楚延时时长。
W801的SDK中官方给的延时函数为:
tls_os_time_delay(5000/HZ);
.
const unsigned int HZ = configTICK_RATE_HZ;
.
void tls_os_time_delay(u32 ticks)
{
vTaskDelay(ticks);
}
//其中HZ为:
#define configTICK_RATE_HZ ( ( portTickType ) 500u ) //时间片中断的频率
算一下延时是如何来的。
首先看一下Rtos的时钟配置文件:FreeRTOSconfig.h,只看时钟相关
#define configCPU_CLOCK_HZ ( ( unsigned long ) 40000000 ) /* =12.0MHz xtal multiplied by 5 using the PLL. *///内部处理器执行频率
#define configTICK_RATE_HZ ( ( portTickType ) 500u ) //时间片中断的频率
上述代码中:
configCPU_CLOCK_HZ 表示时钟频率,
configTICK_RATE_HZ 表示规定的tick周期,表示每秒钟多少个滴答(tick),将一秒钟分解为500个滴答,每一个滴答就是2ms。
一个tick的时间计算如下:
time_tick = configCPU_CLOCK_HZ/configTICK_RATE_HZ/configCPU_CLOCK_HZ;
例如:
40000000/500/40M = 2000us = 2ms
因此这里将configTICK_RATE_HZ改为1000u
#define configTICK_RATE_HZ ( ( portTickType ) 500u ) //时间片中断的频率
time_tick = 40000000/1000/40M = 10000us = 1ms
这样一个tick就是1ms,这里的1ms并不是标准的1ms,但是大概差不多。
2、806裸机版本的US延时
#include "wm_hal.h"
#include "assert.h"
//一条nop等于 1/(freq(Mhz)/12)us
//240/160 MHZ下 3个nop就是20ns
//160MZH 48个nop就是1us
//240Mhz 80个nop就是1us
//可以实现870us以下的延时,多了的 就不要用了。不准。
//5u以下的延时会存在误差 注意。
static void Delay_Us(uint8_t freq,uint32_t time)
{
uint32_t i;
uint16_t num = 90;
if(time > 1000)
{
printf("delay time is too lager than 1000, please use HAL_Delay()\r\n");
}
switch(freq)
{
case 240: num = 80;break;
case 160: num = 53;break;
default: printf("delay input freq err...default set 240MHZ us time \r\n ");break;
}
for (i = 0; i < (num)*time; i++)
{
__NOP();
}
}