发新帖本帖赏金 3.00元(功能说明)我要提问
123下一页
返回列表

总结自己写程序的缺点,求大神、前辈点播

[复制链接]
4238|58
手机看帖
扫描二维码
随时随地手机跟帖
578896817fyt|  楼主 | 2015-8-27 15:02 | 显示全部楼层 |阅读模式
[img]出来工作也写过两个案子的程序,虽然程序功能可以完成案子要求,但总感觉程序写的很烂。
请各位高手指出,以便写代码能力以后有更大的提供,谢谢各位。
1.标志位满天飞,怎么办?一个工程写了30多个标志位
2.多文件分离不明显。例如一个UART通信的文件,要用到一个定时器来计算一些时间动作,我会把定时器的配置和中断函数放在uart文件里面,这样好吗?
3.另外单片机常用的指针有没有高手有相关的例子可以借鉴的,或者学习教程?因为我写程序还不会用指针,都是用数组。
4.我会用到很多全局变量。
求大神前辈点播,拜谢[/img]
数组指针.png
标志位.png
定时中断.png

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-09-06

相关帖子

ayb_ice| | 2015-8-27 15:22 | 显示全部楼层
用驱动的概念去写
通过API调用完成功能,不需要直接去访问某个模块的变量,
某个模块的变量基本不对外访问,只对特定模块有用,实在要访问也是只读属性

去了解下RTOS,你就明白很多

使用特权

评论回复
舒斯特尔| | 2015-8-27 15:59 | 显示全部楼层
用ucos 之类的系统吧,这样代码以后也好维护

使用特权

评论回复
578896817fyt|  楼主 | 2015-8-28 08:27 | 显示全部楼层
ayb_ice 发表于 2015-8-27 15:22
用驱动的概念去写
通过API调用完成功能,不需要直接去访问某个模块的变量,
某个模块的变量基本不对外访问 ...

谢谢前辈,您的意思是把模块写成只有输入,输出接口的函数。
但是函数之前是否也需要有一些标志位或者变量之前的传递,还有就是通过定时做一些超时机制

使用特权

评论回复
578896817fyt|  楼主 | 2015-8-28 08:28 | 显示全部楼层
舒斯特尔 发表于 2015-8-27 15:59
用ucos 之类的系统吧,这样代码以后也好维护

谢谢  我刚下载了邵贝贝的ucos来看,过几天买这本书学习一下。

使用特权

评论回复
ayb_ice| | 2015-8-28 08:36 | 显示全部楼层
578896817fyt 发表于 2015-8-28 08:27
谢谢前辈,您的意思是把模块写成只有输入,输出接口的函数。
但是函数之前是否也需要有一些标志位或者变 ...

当然也需要变量,标志位之类的东西,但这些只与这个模块有关,一旦调试OK,一般就固定不动了,是很可靠的

,当然这也需要有良好的整体运行框架,RTOS就是解决类似问题的,一般情况下项目不复杂的话,可以模仿RTOS的运行机制,自己写个简单的框架,

我就是这样做的,自己写了个简单框架,几乎所有的项目都是一样的写程序,很多模拟都是一样的代码,仅仅针对硬件移植一下就可以了,模块经过几年的项目积累,BUG几乎是没有了。。。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
578896817fyt + 2
dirtwillfly| | 2015-8-28 09:25 | 显示全部楼层
578896817fyt 发表于 2015-8-28 08:27
谢谢前辈,您的意思是把模块写成只有输入,输出接口的函数。
但是函数之前是否也需要有一些标志位或者变 ...

看这些标志位是否必要,尽量做到低耦合

使用特权

评论回复
hobbye501| | 2015-8-28 10:04 | 显示全部楼层
跟楼主一样 编程还没有形成自己的系统框架

使用特权

评论回复
ningling_21| | 2015-8-28 10:27 | 显示全部楼层
网上有很多编程规范楼主可以去了解一下

使用特权

评论回复
578896817fyt|  楼主 | 2015-8-28 10:58 | 显示全部楼层
本帖最后由 578896817fyt 于 2015-8-28 11:00 编辑
ayb_ice 发表于 2015-8-28 08:36
当然也需要变量,标志位之类的东西,但这些只与这个模块有关,一旦调试OK,一般就固定不动了,是很可靠的 ...

嗯嗯,看了比较多前辈关于框架的帖子,我写比较简单的程序心里有一个框架。但是如果状态复杂了,或者加一些超时啊,一下异常处理的状态的时候,就很容易用很多标志位,然后就感觉乱了。另外前辈关于单片机用到的指针有什么推荐学习的,一直都不会用这个,都是用数组

使用特权

评论回复
578896817fyt|  楼主 | 2015-8-28 10:59 | 显示全部楼层
hobbye501 发表于 2015-8-28 10:04
跟楼主一样 编程还没有形成自己的系统框架

是的  还有很多要学习的。:lol

使用特权

评论回复
ayb_ice| | 2015-8-28 11:23 | 显示全部楼层
本帖最后由 ayb_ice 于 2015-8-28 11:24 编辑
578896817fyt 发表于 2015-8-28 10:58
嗯嗯,看了比较多前辈关于框架的帖子,我写比较简单的程序心里有一个框架。但是如果状态复杂了,或者加一 ...

一般指针也不难,

倒是很多框架需要用到函数指针,主要是框架比较灵活,很多地方是回调用户的程序,但又不能固定为某个函数,所以只能用函数指针了,由用户决定调用什么函数,比如某个定时器超时了,由用户决定超时了要做哪些动作,
以前用过RF4CE协议栈,写的很好,就是这样的,用户调用发送函数(真正发送完数据可能需要较长时间),系统其实只是将数据保存起来了,等待发送,然后函数立刻返回,等系统真正发送完毕,就会调用一个回调函数,将发送结果通过参数的形式告知用户,用户根据需要写这个函数的实际内容,比如显示发送成功,发送失败,LED指示。。。
这样的话,整个框架是在高速运行的,不会产生阻塞情况,实现了多任务处理,而且因为没有抢先情况,避免了很多公共资源抢占的问题,整个系统很稳定,(抢先虽然实时性更高,但容易产生死锁,优先级反转,占用资源大等问题)
我的框架和这个有些类似

使用特权

评论回复
ayb_ice| | 2015-8-28 11:27 | 显示全部楼层
变量结构建议多用结构体

结构可以提高程序可靠性,可维护性,有一定的封装性

使用特权

评论回复
lgq1542380129| | 2015-8-28 13:35 | 显示全部楼层
个人认为:分成.c和.h来写,这样函数可写成静态函数,全局变量也可以定义为静态的;参数返回多用函数返回;一个功能尽量写成一个函数,可用回调函数;数据传递多用指针;对一些同一属性的多用结构体;多用条件编译指令,以便更改调试。就知道这么多,望各路大神指正。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
578896817fyt + 1
286005374| | 2015-8-28 14:11 | 显示全部楼层
正在跟楼主一样迷惑中

使用特权

评论回复
lib6303c| | 2015-8-28 14:15 | 显示全部楼层
ayb_ice 发表于 2015-8-28 11:27
变量结构建议多用结构体

结构可以提高程序可靠性,可维护性,有一定的封装性 ...

我的标志位也封装在某个模块的结构体里,很清楚,也易读!

使用特权

评论回复
ayb_ice| | 2015-8-28 15:08 | 显示全部楼层
lib6303c 发表于 2015-8-28 14:15
我的标志位也封装在某个模块的结构体里,很清楚,也易读!

对的,

另外14L说的都是不错的方法

使用特权

评论回复
discussant| | 2015-8-29 10:05 | 显示全部楼层
lgq1542380129 发表于 2015-8-28 13:35
个人认为:分成.c和.h来写,这样函数可写成静态函数,全局变量也可以定义为静态的;参数返回多用函数返回; ...

讲得有些高深。能否将第一个静态变量和静态函数举例示范给我们看看?多谢!

使用特权

评论回复
lgq1542380129| | 2015-8-29 10:28 | 显示全部楼层
discussant 发表于 2015-8-29 10:05
讲得有些高深。能否将第一个静态变量和静态函数举例示范给我们看看?多谢! ...

您好,我是说,在一个.c文件下,函数可定义成static,全局变量可以定义成static了。static,是有好处的。非要在另一个.c文件下使用这个.c的函数和变量那要extern了。我是小菜鸟的,说的不到位,望您指正。

使用特权

评论回复
Messi1999| | 2015-8-29 14:32 | 显示全部楼层
楼主可以试试加上ucos或者freeRtos之类的系统,就不会遇到那么多的问题了

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

47

帖子

1

粉丝