嵌入式开发和c/c++编程经验总结

          接触单片机和C语言已经十多年了,接触linux和嵌入式也有7-8年。见过不带界面的linux系统,树莓派和ubuntu等常见系统,还有fedora,centos等主要不常见的linux系统。

         从最开始学习c语言,再到接触51系列单片机,使用Arduino单片机板,后来接触ARM系列内容,使用树莓派,Linux系统,最近几年,又接触使用了英伟达的TX2,AGX Xavier,Xavier NX,c++和Qt开发,个人对整个c/c++编程,linux系统,驱动层算是都有了一个接触和认识。所有的编程,从语法来看,都是英文字母组成的单词(有些也是中文的表达)组成的各种逻辑,从数学来看,都是各种计算,逻辑运算(与或非);从计算机角度来看,都有编译链接成执行程序后,一段段0,1的数字,然后计算机来对其进行理解,再做各种计算。

     先说入门的单片机吧,51单片机,大学课本的东西。当时学的时候,感觉一个小小的单片机,或者MCU,就可以执行一段程序,比如简单点的温度高就报警,检测到人就提示,电饭锅煮饭的程序……当然还可以控制小车,控制遥控船等等。这样觉得很神奇,而且那时正是智能手机刚刚崛起的时候,32位ARM 处理器开始火起来了。2011年时,ARDUINO开源硬件在意大利出现了,而2012年,我有幸接触到了它,并购买了Arduino UNO单片机板,当时要60多元一块板(而2018年左右开始,一块Arduino UNO的板,只要15元左右)。为什么这个Arduino受欢迎呢?51单片机烧写程序挺麻烦的,当时买一个开发板,包含烧写之类,可能需要300块左右,而且单片机这样的小芯片,很容易各种尝试或不规范的操作,导致烧掉,那就很麻烦!而Arduino 板,只需要1根USB线,就可以烧写程序。路由器,刷过 openWRT系统,可以用来传输图像。

     接下来,分几部分总结相关经验和理解。

Linux环境

     常见的有带桌面环境,如ubuntu,树莓派系统,jetson的系统(基于debian居多),还有一类不带桌面的嵌入式,如剪裁的linux(华为主板,TI主板所带的系统),centos等。带桌面的又分为在X86或X64的CPU架构下运行,还有在ARM 32位还是64位下运行。不带界面的linux系统,更多是针对ARM cpu的,功耗更小。Linux系统主要由内核,驱动、库、系统调用,应用层组成。

     Linux由于其开源性,广泛用在各种设备上,大到各种服务器,小到嵌入式设备:打卡机、小小的树莓派等。谷歌的服务器,据说是很多台linux电脑组成,可能是上万台以上。linux中,传输文件,一般可采用nc命令,而scp命令工具更高级方便。登陆设备,一般也采用ssh的方式。

串口读写

   串口读写,在嵌入式设备中,属于一种很常见的操作。像一个通过usb连接,TTL或rs232等接口协议连接的设备,如定位模块,单片机模块,IMU模块、uwb模块,都可能需要与主控板通讯或交互数据。像主控板,直接与定位模块通过串口(rx,tx,gnd等线)直接连接,那么读取定位模块的数据,需要基于串口协议来获取串口设备句柄,设置波特率、超时、是否阻塞读取等,然后进行读写操作。

指针

      C和c++强大的一点,是基于指针操作数据或内存,这样处理数据,速度很快,效率很高。当然指针使用不好,就容易出现段错误,野指针等等错误。大学时,学习C语言时,对指针、指针变量、指向指针,总会有些困惑,还有指针偏移。指针变量(int* p),说白了,就是一个地址,所以可以对一个局部变量或数组等,通过取地址的方式获取它的地址,。而指针,或纸箱指针存储的内容,则执行这个地址所存储的内容,p->.那另一个问题是,通过这个指针,我们有时不仅可以访问这个首元素,还可以访问它相邻的元素。这个里面一方面使用了指针偏移(p++,p--,++p,--p),但指针怎么知道要偏移多少呢? 这个里面就涉及到指针所指向的数据类型,如char,int,double,所占的字节长度是不一样的,那么每做一个p++,p--,其地址偏移也是不一样的。

I2C SPI

 嵌入式设备通讯的常见协议。

网络通讯

tcp,udp,http等 Socket,还有像mqtt,基于消息订阅和发布。

c/cpp之间的切换和区别

    c可以直接与硬件打交道,可操作硬件和内存,而c++是以c的基础优化升级而出现,面向对象,并支持STL,算法,和模板编程等。Java是以c++的基础,采用虚拟机(JVM)的形式,更多的也是面向对象,并提供了很多库的形式,网络、并发数据流(购买火车票,网购)中使用较多。而比较容易上手,高中就可能学习的,可能是python,脚本程序,既可以计算,又在深度学习,界面开发、服务器等展示其能力。从实际工作和业务来说,c/c++的执行效率和满足软件的复杂性,都是可以的,当然c++对复杂软件的支持能力更强,也可以支持界面开发。而python的执行效率偏低,但可操作性强,上手验证较快。

     学习c++,可以参考Github上相关仓库,比如英伟达的jetson,GitHub - dusty-nv/jetson-inference: Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.

    还有像STL的一些代码和使用,都是很好的学习。个人也积累了一些c++的基本代码,后续提供相关链接。

  寻找质数(素数)

       质数,就是大于1的自然数,只能被1和它本身整除的数。之前考虑过用python写程序搜索,但主要规则可能没考虑清楚,并没有实践。最近看了一些分析,又做了搜索。一方面,本问题很开放,另也有涉及相关算法,多线程,有兴趣的小伙伴可以研究下。(limits.h文件对最大的UULONG_MAX做了定义)

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <unistd.h>
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
  long int a;
  int baseNumber=2;
  unsigned long int MAX_Number=pow(2,32)-1;
  const double  kValue_gap=1e-8;
  int count=0; 
  bool b_not_a_special_number=false;
  string filePath="./";
  string fileName="number.txt";
  ofstream  fin;
  fin.open(fileName);
  if(!fin.is_open()){
   cerr<<"open file failed!\n";
  }

for(unsigned long int i=0; i<MAX_Number;++i)
 {
   if(i%2!=0 )
  { 
   if (i<32)
   {
    a=pow(baseNumber,i)-baseNumber; // 参考相关判断质数公式
    if(a%i ==0){
   count++;
   cout<<">>>>find a special number:"<<i<<"***index"<<count<<endl<<endl;
    }
   }
  else if( (i%3 !=0) &&  (i%5 !=0) && (i%7 !=0) ){
      if(i%11 !=0 && i%17 !=0 && i%13 !=0 && i%19 !=0)
     {
    double number_sqrt_value = sqrt(i*1.0);
    int  number_sqrt =sqrt(i);
    if(number_sqrt_value-number_sqrt <kValue_gap){
    printf("number_sqrt_value is %f\n",number_sqrt_value);
    cout<<i<<",Not a special number ,sqrt value:"<<number_sqrt_value<<endl;
    continue;
    }
    count++;
    if(i>1000){
     for(int  j=3; j <number_sqrt;j+=2)
       {
         if(i%j==0){
          b_not_a_special_number=true;
          break;
           }
         else{
          b_not_a_special_number=false;  // need keep flag false!
          }
       }
    }
    if(!b_not_a_special_number){
    cout<<"maybe a special  number:"<<i<<"***index"<<count<<endl<<endl;
    fin<<"count:"<<count<<"number:"<<i<<endl; 
    if(count%20==0){
    sleep(1);
     }
    } 
     }
    }
  }
  
 }

}

maybe a special  number:290339009***index1832973
maybe a special  number:290339017***index1832974
maybe a special  number:290339029***index1832975
maybe a special  number:290339047***index1832976
maybe a special  number:290339083***index1832977
maybe a special  number:290339123***index1832978
maybe a special  number:290339131***index1832979
maybe a special  number:290339167***index1832980
maybe a special  number:290339197***index1832981
maybe a special  number:290339219***index1832982
maybe a special  number:290339227***index1832983
maybe a special  number:290339237***index1832984
maybe a special  number:290339239***index1832985
maybe a special  number:290339263***index1832986
maybe a special  number:290339303***index1832987
maybe a special  number:290339339***index1832988

也可以思考这些数有没有更好地判断其是否是质数的方法。

多线程  

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值