好友讓我看這段代碼
周末的時(shí)候,一個(gè)微信好友讓我旁邊看一段代碼
在寫下面的文章之前,我先簡單說下
寫代碼是一件非常有意思的事情,同時(shí)也是一件需要我們認(rèn)真對待的事情,我不認(rèn)為一定要把代碼寫的和大神一樣看不明白,但是至少要邏輯清晰,不能出現(xiàn)混淆不清的情況發(fā)生。
最近一年,我也在不斷的提高自己的編程能力,之前的工作,很多是做處理系統(tǒng)和驅(qū)動(dòng)等事情,但是實(shí)際的應(yīng)用編程并沒有很強(qiáng)的功底。也是在不斷學(xué)習(xí)和前進(jìn),也非常感謝朋友和同事們對我的幫助和支持。
——
這段代碼是這樣的
static unsigned short timer_tick_cnt = 0;
static ___interrupt USER_TIMER void timer_isr(void)//中斷服務(wù)函數(shù)
{
if (TMR->CON & BIT(15)) //定時(shí)器溢出中斷標(biāo)志位
{
TMR->CON |= BIT(14);//清中斷
///putchar('@');
//todo,中斷函數(shù)執(zhí)行程序...
timer_tick_cnt++;
}
}
static unsigned short timer_tick_get_current_timer(void)
{
unsigned short timer_tick_count = timer_tick_cnt;
return timer_tick_count;
}
unsigned short usRecord = 0;
unsigned char timer_tick_timeout_wait(unsigned short *p_var, unsigned short timeout)
{
if( timer_tick_get_current_timer() - *p_var < timeout )
{
///usRecord = timer_tick_get_current_timer();
///printf("=======rec=%d,*p_var=%d=====\n",usRecord,*p_var);
///printf("====TIMER return 0====\n");
return 0;
}
*p_var = timer_tick_get_current_timer();
///usRecord///printf("====TIMER return 1====\n");
return 1;
}
unsigned short testTimer = 0;
#define TIME_TICK_1MS_1S 1000
void testHandler(void)
{
if(timer_tick_timeout_wait(&testTimer,TIME_TICK_1MS_1S))//1ms的中斷溢出,故1000為1s
{
printf("helloworld\n");//問題點(diǎn)是如果timer_tick_timeout_wait的參數(shù)timeout定義為unsigned short,在約65s(65535ms)后該函數(shù)一直返回0而不再返回1,unsigned int正常
}
}
int main(void)
{
timerInit();//1ms的定時(shí)器中斷,該函數(shù)不是問題點(diǎn),問題點(diǎn)在下面
while(1)
{
testHandler();
}
}
這個(gè)是原始的代碼,我沒有做任何的修改。
問題他在代碼里面描述的比較清晰
//問題點(diǎn)是如果timer_tick_timeout_wait的參數(shù)timeout定義為unsigned short,在約65s(65535ms)后該函數(shù)一直返回0而不再返回1,unsigned int正常
細(xì)心的人會(huì)發(fā)現(xiàn)一個(gè)問題

這 timer_tick_cnt 該死的變量一直遞增
我之前寫過一篇文章,說是內(nèi)核里面時(shí)間戳的問題,如果保存時(shí)間戳的變量定義有問題,那可能也會(huì)導(dǎo)致時(shí)間有問題。
這也是他發(fā)現(xiàn)他的代碼有問題的原因。
——
我再說下其他的情況
他設(shè)計(jì)的這個(gè)系統(tǒng)的初衷是系統(tǒng)定時(shí)器到一個(gè)指定的時(shí)間后去執(zhí)行一個(gè)函數(shù),但是直接把在定時(shí)器里面的變量拿到外面去判斷,這里就不很好。
定時(shí)器應(yīng)該只完成定時(shí)的事情,至于到了多少時(shí)間,告訴外面的其他任務(wù)就好了,這樣可以做到高內(nèi)聚。
變量timer_tick_cnt在其他地方操作,后續(xù)有問題排查起來肯定會(huì)很難受。


——
變量的命名、函數(shù)的命名、代碼風(fēng)格
簡直不堪入目,有的地方用下劃線、有的地方用駝峰。

還有這個(gè)函數(shù)的執(zhí)行,我有點(diǎn)看不懂

CPU就是這樣被你累壞的啊。
關(guān)于變量和函數(shù)命名的網(wǎng)站,我推薦這個(gè),這個(gè)網(wǎng)站非常適合我們
https://www.chtml.cn

這不比你自己想好多了。
——
宏的含義不清晰

這樣給宏命名是非常不好的,先是1MS 又是1S,所以這個(gè)宏到底是啥,如果不看代碼的話是很難理解意思。
如果是我,我會(huì)表明這個(gè)宏做什么事情,但是后面要加上MS,因?yàn)檫@個(gè)事件是MS的時(shí)間。
——
函數(shù)的命名大家可能也發(fā)現(xiàn)了,有些是駝峰,有些下劃線。
這不是關(guān)鍵,關(guān)鍵是有些函數(shù)的用意沒有表明清楚,不知道這個(gè)函數(shù)的作用是什么。
以上是我自己的個(gè)人觀點(diǎn)
我覺得寫代碼是要對待一個(gè)藝術(shù)品,把這個(gè)東西做得好,做得優(yōu)秀,是一件令我們愉悅的事情。
大家共勉之!
