分享到:

沈阳金成致远教育咨询有限公司沈阳金成致远教育咨询有限公司主要培训:沈阳嵌入式培训,沈阳单片机培训,沈阳嵌入式培训多少钱,沈阳单片

联系资料

沈阳金成致远教育咨询有限公司
所在地区:
辽宁省 沈阳市
公司主页:
暂无
电话号码:
024-*******
传真号码:
暂无
联 系 人:
姜老师
移动电话:
暂无
电子邮箱:
暂无

沈阳嵌入式培训中心告诉你闲谈嵌入式编程的复杂性

发布于 2017年11月08日

[摘要]沈阳嵌入式培训中心告诉你同事在uC/OS-II下开发一个串口的驱动程序,沈阳嵌入式培训哪家好驱动和接口在测试中均为发现问题。应用中开发了个通讯程序,沈阳嵌入式培训机构串口驱动提供了一个查询驱动缓冲区字符的函数
能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。很多朋友都是从PC编程转向嵌入式编程的。在中国,嵌入式编程的朋友很少是正儿八经从计算机专业毕业的,都是从自动控制啊,电子相关的专业毕业的。这些童鞋们,实践经验雄厚,但是理论知识缺乏;计算机专业毕业的童鞋很大一部分去弄网游、网页这些独立于操作系统的更高层的应用了。也不太愿意从事嵌入式行业,毕竟这条路不好走。他们理论知识雄厚,但缺乏电路等相关的知识,在嵌入式里学习需要再学习一些具体的知识,比较难走。
虽然没有做过产业调查,但从我所见和所招聘人员,从事嵌入式行业的工程师,要么缺乏理论知识,要么缺乏实践经验。很少两者兼备的。究其原因,还是中国的大学教育的问题。这里不探讨这个问题,避免口水战。我想列出我实践中的几个例子。引起大家在嵌入式中做项目时对一些问题的关注。
第一个问题:
告诉你同事在uC/OS-II下开发一个串口的驱动程序,驱动和接口在测试中均为发现问题。应用中开发了个通讯程序,串口驱动提供了一个查询驱动缓冲区字符的函数:GetRxBuffCharNum()。 高层需要接受一定数量的字符以后才能对包做解析。一个同事撰写的代码,用伪代码表示如下:
bExit = FALSE;
do {

    if (GetRxBuffCharNum() >= 30)

           bExit = ReadRxBuff(buff, GetRxBuffCharNum());

} while (!bExit);
这段代码判断当前缓冲区中超过30个字符,就将缓冲区中全部字符读到缓冲区中,直到读取成功为止。逻辑清楚,思路也清楚。但这段代码是不能正常工作。如果是在PC机上,定然是没有任何问题,工作的异常正常。但在嵌入式里真的是不得而知了。同事很郁闷,不知道为什么。来请我解决问题,当时我看到代码,就问了他,GetRxBuffCharNum()是怎么实现的?打开一看:
unsigned GetRxBuffCharNum(void)
{

    cpu_register reg;

    unsigned num;

    reg = interrupt_disable();

    num = gRxBuffCharNum;

    interrupt_enable(reg);

    return (num);

}

很明显,告诉你由于在循环中,interruput_disable()和interrupt_enable()之间是个全局临界区域,保证gRxBufCharNum的完整性。但是,由于在外层的do { } while() 循环中,CPU频繁的关闭中断,打开中断,这个时间非常的短。实际上CPU可能不能正常的响应UART的中断。当然这和uart的波特率、硬件缓冲区的大小还有CPU的速度都有关系。我们使用的波特率非常高,大约有3Mbps。uart起始信号和停止信号占一个比特位。一个字节需要消耗10个周期。3Mbps的波特率大约需要3.3us传输一个字节。3.3us能执行多少个CPU指令呢?100MHz的ARM,大约能执行150条指令左右。结果关闭中断的时间是多长呢?一般ARM关闭中断都需要4条以上的指令,打开又有4条以上的指令。接收uart中断的代码实际上是不止20条指令的。所以,这样下来,就有可能出现丢失通信数据的Bug,体现在系统层面上,就是通信不稳定。

更多行业资讯请关注沈阳金成致远教育咨询有限公司官网   网址