|
发表于 2011-8-23 00:42:58
|
显示全部楼层
正好也在搞M0,也是nxp的,手头有zlg移植的ucosii,测了一下ucosii的中断延时,交作业了:
手上的板子晶振是12M的,奶奶的lpc的pll只能做整数倍频,害的老子还换了10M的晶振,才调出LZ一样的40M来。
测试方法:初始化定时器,当计数到1000时请求中断,进入中断立即读定时器的值,减去1000即为中断延迟。偷懒了,没用IO,直接读定时器,结果应该和写IO一样的。
测试代码:
void TIMER32_0_IRQHandler (void)
{
volatile uint32_t time,pr;
uint16_t loop;
// OSIntEnter(); ----------这个调用比较费时,要得到极限最短延迟,关掉它。
time = LPC_TMR32B0->TC ;
ttt[iii++] = time;
if(iii == 1000)
{
pr =0;
time = ttt[0];
for(loop = 0; loop < 1000;loop++)
{
pr += ttt[loop]-1000;
if(time < ttt[loop])
time = ttt[loop];
}
pr /= 1000;
}
LPC_TMR32B0->IR = 0xff;
LPC_TMR32B0->TC = 0;
*(uint32_t*)0xe000e280 = (uint32_t)(1<<TIMER_32_0_IRQn);
// OSSemPost(TimerSem);
// OSIntExit();
}
/*********************************************************************************************************
** Function name: timer0Init
** Descriptions: 32位定时器0初始化函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void timer0Init (void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9); /* 打开定时器模块 */
LPC_TMR32B0->IR = 1;
LPC_TMR32B0->PR = 0; /* 设置分频系数 */
LPC_TMR32B0->MCR = 1; /* 设置MR0匹配后复位TC并产生中断*/
LPC_TMR32B0->MR0 = 1000; /* 设置中断时间 */
LPC_TMR32B0->TCR = 0x01; /* 启动定时器 */
NVIC_EnableIRQ(TIMER_32_0_IRQn);
NVIC_SetPriority(TIMER_32_0_IRQn, 2);
// zyIsrSet(TIMER_32_0_IRQn, 2); /* 设置中断并使能 */
}
测量1000次的结果如下:
最短中断延时:40*25nS = 1000nS
平均中断延迟:60*25nS = 1.500uS
最长延迟:787*25nS=19.675uS
结论:相同环境下,ucosii的中断延时最小值优于djyos,平均值略输给djyos,关键是最坏情况。
按LZ所述,djyos的1.425uS绝对保证的,ucosii绝对保证值肯定≥19.675uS,相差十多倍。
以下文字版主添加:
数据很给力啊,看来我要得瑟一会了。
djyos的1.425uS是在系统非常繁忙时测到的,测量次数超过10000次。
对于实时系统来说,最坏情况是最重要的,这不是田忌赛马,就算你赢了“最好情况”和“平均情况”两场,只要“最坏情况”输掉了,满盘皆输,何况ucosii的平均情况也比djyos差。
我敢说,1000次测量,很难测到最坏情况。 |
|