2.73 交叉编译python_C与Python,古老与新锐语言的对比思考,Python是否能取代C在嵌入式的地位?...
发布日期:2021-06-24 14:06:21 浏览次数:2 分类:技术文章

本文共 3317 字,大约阅读时间需要 11 分钟。

6c2a13c2e44be0bacea15fc08df02684.png

笔者是C+MCU开发者,长期使用C语言作为工作上的编程语言。用的最多的是“交叉编译”的概念,也就是在PC机上将编译好的二进制文件,通过一定的方式写入硬件的程序存储器中,使得MCU执行对应的功能。

在笔者看来,C语言目前最大的应用范围在于两点:

1 灵活 小型 低成本设备的软件开发,主要是采用交叉编译方式

用C语言以及ARM提供的MDK或者IAR编译平台,编译出二进制文件烧录进入MCU,使得MCU执行对应功能。这里懂的人都明白的,不懂得可以补充一些单片机基础知识,这里不赘述了。

2 为运行LINUX的设备,提供C的底层驱动支持

在python这样的新锐语言没有出现之前,想要在运行linux的设备上编程实现一些功能,比较原生的方法就是用C做编程,比如在屏幕上显示“hello world”这样的功能,那么只要在linux某个目录创建hello.c,然后用vim等工具把代码写完之后,gcc hello.c 然后执行 hello.out 就ok了。这样的功能可以扩展LINUX系统,为用户定制特定功能。比如,我就想我这台linux设备成为一台计算器,帮我计算1+1等于几的普通计算器,那么你把cal.c写好,想办法让linux一旦运行起来就自动运行cal.out,这样就完成计算器的功能了。当然这有点“杀鸡用牛刀”。

这里C的使用方法就不是交叉编译了,而是直接在linux的环境下进行编译运行。

最典型的linux C开发的实际作用就是为新的外设提供驱动代码。例如一个摄像头。在笔者看来,MCU完完全全是可以驱动摄像头的,用的方法就是根据摄像头厂家的datasheet,用硬件SPI或者IIC,或者直接GPIO来编写时序,完成与摄像头控制芯片的通讯,从而访问摄像头的功能。linux也是一样的,也需要通过IO模拟时序来访问摄像头设备。

摄像头通讯最底层的操作是IO口的高/低电平时序,完成这样的时序需要精准快速的延时,精准快速的电平转换。LINUX硬件开发者提供了快速改变电平的API,而这种API绝大多数都是以C语言的形式给出的,众所周知,C是最完美的硬件开发语言。所以,绝大多数摄像头厂家,都会给自己的摄像头产品配一个C语言完成的linux的驱动代码。使用者能够快速的将这些驱动代码部署到自己的linux系统中。Linux嵌入式软件工程师,大多数都是干这个事情的。因为硬件不停的迭代更新,与LINUX的兼容始终需要有人去做。

8dd1cb6c8d18220294c7686165f09191.png

C语言开发对笔者学习编程的巨大帮助

笔者长期做C开发,自以为对C语言有一定的掌握。当掌握C语言的开发过程后,笔者再去学习其他语言,有了莫大的帮助,这里的帮助在于如下几点,

1 函数式的编程方式

笔者学习到的语言,无论是java python C#,都逃不脱模块化的函数式编程思维,大同小异,而且极有可能都是从C语言的思想演化出来。提一个题外话,函数式编程思想,为笔者为人处世的做事方式也有很大的影响,开始喜欢大事化小,无论做什么事,都会把诸如“改变电平方法”的“原子操作”封装测试好,然后自下而上的做事。对应到高级语言的学习,笔者会喜欢把最底层也是最关键的代码,封装好,无论是封装成方法,还是封装成类,都首先将其测试好,然后再进一步往上堆砌代码。

2 硬件编程思想

C是硬件编程语言,我总是再网上听到有人黑C语言,说C不安全,容易“内存泄漏”,实际上,我在想质疑者是不是在说“数组越界”的问题?如果站在硬件开发者的角度来看待这个问题,我会认为,这样的不安全是C程序员的问题,而不是C本身的问题,因为无论是你通过

uint8_t buf[100];

创建内存区域,还是通过malloc动态获得内存空间

P = malloc(100)

系统仅仅是给你拨取了这么多的内存空间,像是房子一样,至于你让更多的人住进了原本不多的房子里,那就是你的问题了。针对这样的问题,笔者从来都是这样避免的

1 尽量避免使用动态分配内存机制,因为绝大多数MCU没有MMU,用了也是白用,反而增加不确定性。

2 使用固定长度数组的时候,随手取模

..
buf[i % 100]

3 谨慎使用指针

31fbe2cfba695d275d52e01813351e6d.png

如果带着硬件编程的思想去看待上层语言,是有非常大的好处的,笔者认为上层编程语言是和硬件紧密相连的,但是随着技术发展,大家不再愿意把他们当作一个整体看待,而是认为分工合作,彼此都是黑箱子,对大家都好。

上层语言总会有类似“事件”这个概念,针对到硬件思想,这样的事件实际上就是一个开始于”电平上升沿/下降沿”的变化,底层硬件在捕获这样的变化之后,会将后续的数据挨个存入硬件存储器,存储完成之后,会将事件和数据一并上报,上报给上位机处理单元。网络编程也是,http请求也是,都是读写的过程。读会发起读事件,写会发起写事件。

硬件编程思想给笔者学习上层语言带来的好处,我可能没说清楚。但是总有一点是可以明确表达的,那就是“自信”,知道你使用print函数打印hello world 底层硬件是怎样帮你实现的。

3 对数据结构的把握

笔者非常强烈的推荐使用C语言作为学习数据结构的语言,因为C最简单,没有太多前人的封装,能够去真正的了解数据结构的原理和好处。现在的语言有点太方便了,用python使用链表,import Linklist应该就可以了吧。这样开发效率是快,而且真正实际工程的时候笔者强烈推荐用轮子,但是如果是处于学习目的,一定要用C慢慢来。

笔者做一个不恰当的比喻,好像国外总是把钢铁卖给咱们,咱们只要花钱(import)就可以用钢铁了,但是万一哪天人家不卖给我们了呢?pip install不给咱们引入库了,pycharm这样的工具不给咱们玩了,那我们怎么办?总之熟悉原理总不会有大错!

笔者,用C语言,一点点的从队列,链表,二叉树,图,一点点慢慢来构建学习,等到了真正要用的时候,笔者也不会用自己的代码,而是import,但是心里对这个数据结构是非常有数的。换言之,就是心里会想,这玩意,我自己会搞,但是你帮我搞吧,搞错了看我不收拾你!而不是一脸崇拜的说,哇塞你真牛!

C语言的劣势

笔者最为诟病的C语言的一个特性就是对字符串的处理能力,这个实在是太伤脑筋。C语言的spilt函数是真的不好用,不过仅局限于不好用,很难用。C比起python等上层语言对字符串的处理能力,实在是太弱了。

为了去玩一些炫酷的功能,比如网络数据收集/智能聊天机器人等等,笔者用心学习了Python,觉得实在是完美,完美之处其他文章都写得很多了,这里笔者谈谈Python与C的不同路线,和Python以后会不会取代C的问题。

098a556f782c637310dc8d2743af40fd.png

上图是爬取富豪榜的代码截图。微信聊天机器人也玩过了,还有PYTHON 修饰图片源码,有兴趣的可以到我的github上拉下来玩玩

JingyanChen/python_study

笔者非常关注python是否可以取代C在嵌入式开发的霸主地位,笔者认识到了现在有一个叫做http://www.micropython.org/ (micropython)的东西,在STM32F4系列单片机的基础上实现了python开发的愿景,但是笔者并不看好,因为他不是python,而是蹭了python语法先进性的micropython,关键问题是第三方库支持的缺失。对于python,我最感兴趣的是python是各种算法工程师团队提供其智力成果的API语言,如果我的STM32不能运行这些大佬的算法,那我还要你干什么呢?还不如自己用C慢慢写。

笔者认为,目前python在第一个嵌入式应用层面,也就是“灵活 小型 低成本设备的软件开发,主要是采用交叉编译方式”还不具备取代C的优势。

但是在嵌入式LINUX方面,Python是很有优势的,特别是非最底层的软件开发层面。笔者认为,与硬件紧密交互的代码还是会很长时间以C语言为主,但是倒数第二层现在可以用python去代替了,倒数第三层 直至最高层,都可以用python这样简洁高效的语言去写!你只要下载一个python解释器就好了,简直完美!

///

随笔写写 ,诸君见笑,若有裨益,点赞如何?

转载地址:https://blog.csdn.net/weixin_33309433/article/details/112286642 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ios13看怎么airpods电量_计度器显示电表怎么看电量|计度器显示电表看电量
下一篇:发那科机器人xyz的方向_四足机器人建模仿真(蜘蛛构型,matlab版本)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月30日 04时48分54秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

小兔子带你轻松玩转Scratch 绘制创意复杂图形27 2019-04-28
Scratch计算生肖 电子学会图形化编程Scratch等级考试四级真题答案解析2020-6 2019-04-28
Scratch数草莓 电子学会图形化编程Scratch等级考试四级真题答案解析2020-6 2019-04-28
电子学会图形化scratch编程等级考试二级真题答案解析(选择题)2020-9 2019-04-28
数据库课程设计 java实现学生信息管理系统 软件开发大作业 2019-04-28
电子学会图形化scratch编程等级考试四级真题答案解析(判断题)2020-12 2019-04-28
Scratch加密/解密 电子学会图形化编程Scratch等级考试四级真题 2020-12 2019-04-28
【蓝桥杯真题11】Scratch季节变化 少儿编程scratch蓝桥杯选拔赛真题讲解 2019-04-28
Scratch画雪花 电子学会图形化编程Scratch等级考试四级真题 2020-12 2019-04-28
初学python100例-案例29 判断回文数 少儿编程案例讲解 2019-04-28
【蓝桥杯真题10】Scratch投球 少儿编程scratch蓝桥杯选拔赛真题讲解 2019-04-28
Scratch绘图优化程序 电子学会图形化编程Scratch等级考试四级真题和答案 2020-12 2019-04-28
Scratch河马带球小游戏 蓝桥杯Scratch国赛真题答案和解析 2019-04-28
Scratch画圆 蓝桥杯Scratch国赛真题答案和解析 2019-04-28
Scratch画圆形螺旋 蓝桥杯Scratch国赛真题答案和解析 2019-04-28
初学python100例-案例30 计算闰年 少儿编程案例讲解 2019-04-28
Scratch螺旋多边形小游戏 蓝桥杯Scratch国赛真题答案和解析 2019-04-28
初学python100例-案例31 输入星期几的第一个字母判断是星期几 少儿编程案例讲解 2019-04-28
初学python100例-案例32 男孩女孩小孩人数 少儿编程案例讲解 2019-04-28
【蓝桥杯真题12】Scratch角色装扮 少儿编程scratch蓝桥杯选拔赛真题讲解 2019-04-28