发 帖  
原厂入驻New
[问答]

如何写好嵌入式C语言程序?

91 C语言 程序
分享
怎么才能写好嵌入式C语言程序?
0
2021-3-9 07:05:36   评论 分享淘帖 邀请回答

相关问题

4个回答
  作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的C语言算法基础,以此来实现程序的逻辑构架;最后,灵活运用C语言的指针操作。
  虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程。那么,下文将给你介绍如何耍这“三板斧”。
  嵌入式工程师在编写C语言程序的时候,要针对遇到的问题进行程序构架构建。
  比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。那么,这“三板斧”该如何使用呢?
2021-3-9 19:07:49 评论

举报

第一板斧,用C语言的思维方式进行程序构架构建
  程序分为三大部分:
  a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;
  b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;
  c、提高程序的运行速率,少用循环多用指针。
2021-3-9 19:08:09 评论

举报

  第二板斧,用C语言进行逻辑实现
  a、数据获取,通过printf和scanf进行参数的获取。
  /*读入问题条件*/
  printf(“input total num:”);
  scanf(“%d”, &n);
  printf(“from which num begin:”);
  scanf(“%d”, &k);
  if(k》n||k==0)
  {printf(“please input the right begin num”);
  return 1; }
  printf(“input the out num:”);
  scanf(“%d”, &m);
  if(m》n||m==0)
  { printf(“please input the right del num”);
  return 2; }
  同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。
  b、
  /* 定义链表节点类型 */
  typedef struct node
  {
  int data;
  struct node *next;
  }linklist;
  构建循环链表进行“猴子”的圆圈建设。
  /* 创建循环链表,头节点也存信息 */
  head = (linklist*) malloc(sizeof(linklist));
  p = head;
  p-》data = 1;
  p-》next = p;
  /* 初始化循环链表 */
  for (i = 2; i 《= n; i++)
  {
  s = (linklist*) malloc(sizeof(linklist));
  s-》data = i;
  s-》next = p-》next;
  p-》next = s;
  p = p-》next;
  }
  通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程中需要注意一下几点:内存的开辟,此时遵守使用多少开辟多少的原则。
  如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候有心的话还会联想到双向链表的情况。
  c、
  /* 找到第 k 个节点 */
  p = head;
  for (i = 1; i 《= k; i++)
  {
  p = p-》next;
  }
  找到从第几个位置开始计数。此时,p指向开始的“猴子”。因为采用了链表方法,这个过程只需要关注p指针的next指向即可。
  a、保存初始的“猴子”圆圈参数。
  /* 保存节点总数 */
  total = n;
  printf(“\nthe out num:”);
  q = head;
  为什么要保留这个呢?首先要控制猴子数目,所以保留了全部的数目。其次用q(qurry)来保留剔除猴子前面的链表,并连接剔除猴子后的链表。这样,完成了循环链表的元素删除。
  b、猴子查数。
  猴子查数是整个程序的关键,需要完成以下任务:a、找到开始的“猴子”数;b、删除该“猴子”;c、将删除掉的循环链表首尾连接起来。
  /* 只剩一个节点时停止循环 */
  while (total != 1)
  {
  /* 报数过程,p指向要删除的节点 */
  for (i = 1; i 《 m; i++)
  {
  p = p-》next;
  }
  /* 打印要删除的节点序号 */
  printf(“[%d] ”, p-》data);
  /* q 指向 p 节点的前驱 */
  while (q-》next != p)
  {
  q = q-》next;
  }
  /* 删除 p 节点 */
  q-》next = p-》next;
  /* 保存被删除节点指针 */
  s = p;
  /* p 指向被删除节点的后继 */
  p = p-》next;
  /* 释放被删除的节点 */
  free(s);
  /* 节点个数减一 */
  total--;
  }
  /* 打印最后剩下的节点序号 */
  printf(“\n\nthe last num:[%d] \n\n”, p-》data);
  free(p);
  }
  通过以上数据运算,可以完成相应链表元素的删除,这或许就是C语言程序的魅力所在。
2021-3-9 19:08:14 评论

举报

  第三把斧,使用C语言的指针
  比如本程序的链表指针的定义,p,s,q。
  linklist *head, *p, *s, *q;
  我们知道,指针操作不但可以减少数据操作需要的内存,还可以提高程序的运行速度,这在另一方面达到了我们的“第三把斧”的目的。
  指针的优势,或许在本程序中表现的不明显,在大量数据和对操作速度要求比较敏感的情况下会很明显,比如Linux内核中,就会有很好的体现。
  总之,对于嵌入式工程师,不但能设计出好的硬件电路,如果也能写出好的软件程序就会让我们的生活更加美好。工程师们,耍起这“C语言的三把斧”!
2021-3-9 19:08:28 评论

举报

只有小组成员才能发言,加入小组>>

12040个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /5 下一条

快速回复 返回顶部 返回列表