• 好友让我看这段代码


    周末的时候,一个微信好友让我旁边看一段代码

    在写下面的文章之前,我先简单说下

    写代码是一件非常有意思的事情,同时也是一件需要我们认真对待的事情,我不认为一定要把代码写的和大神一样看不明白,但是至少要逻辑清晰,不能出现混淆不清的情况发生。

    最近一年,我也在不断的提高自己的编程能力,之前的工作,很多是做处理系统和驱动等事情,但是实际的应用编程并没有很强的功底。也是在不断学习和前进,也非常感谢朋友和同事们对我的帮助和支持。

    ——

    这段代码是这样的

    1. static unsigned short timer_tick_cnt = 0;
    2. static ___interrupt USER_TIMER void timer_isr(void)//中断服务函数
    3. {
    4.     if (TMR->CON & BIT(15)) //定时器溢出中断标志位
    5.     {
    6.         TMR->CON |= BIT(14);//清中断
    7.         ///putchar('@');
    8.         //todo,中断函数执行程序...
    9.         timer_tick_cnt++;
    10.     }
    11. }
    12. static unsigned short timer_tick_get_current_timer(void)
    13. {
    14.  unsigned short timer_tick_count = timer_tick_cnt;
    15.     return timer_tick_count;
    16. }
    17. unsigned short usRecord = 0;
    18. unsigned char timer_tick_timeout_wait(unsigned short *p_var, unsigned short timeout)
    19. {
    20.     if( timer_tick_get_current_timer() - *p_var  < timeout )
    21.     {
    22.         ///usRecord = timer_tick_get_current_timer();
    23.         ///printf("=======rec=%d,*p_var=%d=====\n",usRecord,*p_var);
    24.         ///printf("====TIMER return 0====\n");
    25.         return 0;
    26.     }
    27.     *p_var  = timer_tick_get_current_timer();
    28.     ///usRecord///printf("====TIMER return 1====\n");
    29.     return 1;
    30. }
    31. unsigned short testTimer = 0;
    32. #define TIME_TICK_1MS_1S 1000
    33. void testHandler(void)
    34. {
    35.  if(timer_tick_timeout_wait(&testTimer,TIME_TICK_1MS_1S))//1ms的中断溢出,故1000为1s
    36.  {
    37.   printf("helloworld\n");//问题点是如果timer_tick_timeout_wait的参数timeout定义为unsigned short,在约65s(65535ms)后该函数一直返回0而不再返回1,unsigned int正常
    38.  }
    39. }
    40. int main(void)
    41. {
    42.  timerInit();//1ms的定时器中断,该函数不是问题点,问题点在下面
    43.  while(1)
    44.  {
    45.   testHandler();
    46.  }
    47. }

    这个是原始的代码,我没有做任何的修改。

    问题他在代码里面描述的比较清晰

    //问题点是如果timer_tick_timeout_wait的参数timeout定义为unsigned short,在约65s(65535ms)后该函数一直返回0而不再返回1,unsigned int正常

    细心的人会发现一个问题

    a5299db1c4ef368184302a25097d804f.png

    timer_tick_cnt 该死的变量一直递增

    我之前写过一篇文章,说是内核里面时间戳的问题,如果保存时间戳的变量定义有问题,那可能也会导致时间有问题。

    这也是他发现他的代码有问题的原因。

    ——

    我再说下其他的情况

    他设计的这个系统的初衷是系统定时器到一个指定的时间后去执行一个函数,但是直接把在定时器里面的变量拿到外面去判断,这里就不很好。

    定时器应该只完成定时的事情,至于到了多少时间,告诉外面的其他任务就好了,这样可以做到高内聚。

    变量timer_tick_cnt在其他地方操作,后续有问题排查起来肯定会很难受。

    7d254c4184ae6a62ff95f04814465313.png

    27efb973256539001a6cc394e2e43b0a.jpeg

    ——

    变量的命名、函数的命名、代码风格

    简直不堪入目,有的地方用下划线、有的地方用驼峰。

    831502ad808579acbf45c3a54c6a384c.png

    还有这个函数的执行,我有点看不懂

    49e48af358a595dcc68d33a2247c861e.png

    CPU就是这样被你累坏的啊。

    关于变量和函数命名的网站,我推荐这个,这个网站非常适合我们

    https://www.chtml.cn

    b5bafdd67d5e91225c6528a80db1463e.png

    这不比你自己想好多了。

    ——

    宏的含义不清晰

    9ffc52b7e795c789c5e75a2b3d89c293.png

    这样给宏命名是非常不好的,先是1MS 又是1S,所以这个宏到底是啥,如果不看代码的话是很难理解意思。

    如果是我,我会表明这个宏做什么事情,但是后面要加上MS,因为这个事件是MS的时间。

    ——

    函数的命名大家可能也发现了,有些是驼峰,有些下划线。

    这不是关键,关键是有些函数的用意没有表明清楚,不知道这个函数的作用是什么。

    以上是我自己的个人观点

    我觉得写代码是要对待一个艺术品,把这个东西做得好,做得优秀,是一件令我们愉悦的事情。

    大家共勉之!

    1f3900c66b4afdcf0c8aae42747382a8.jpeg

    7ffa7459a896cb2150593dcf3c3b024a.png

  • 相关阅读:
    Charles基础使用指南
    Unity解决:安卓打包设置项目名称为中文名 packageName为英文包名
    学习 Kubernetes的难点和安排
    VueX插件、持久化存储、分包module模块vuex
    SwiftUI 让用户更便捷在 App Store 为 App 打分和评价的超详细介绍
    leetcode 355 设计推特
    blender 场景灯光基础设置
    MySQL查询性能优化解决方案
    技术分享 | 如何使用代理配置快速定位接口测试脚本问题?
    C++ Primer第五版_第十九章习题答案(11~20)
  • 原文地址:https://blog.csdn.net/weiqifa0/article/details/125966798