0
   kdb>kgdb  // 可进入kgdb 模式
   if (dbg_kdb_mode) {
            error = kdb_stub(ks);
    } else {
            error = gdb_serial_stub(ks);
    }
1
   gdbstub.c
        —>
          while (1) {
                         //接收一个完整的数据包或者一帧数据(不同领域说法不一致)
                         get_packet(remcom_in_buffer);
                         //开始处理数据包
                         switch (remcom_in_buffer[0]) {
                         case ‘?’: /* gdbserial status */
                         …
          }

   首先了解下数据包的格式:(GDB Remote Serial Protocol)
   $packet-data#checksum
    两位数校验和的计算方法是,对’$'和’#'间的所有字符求和,然后再对256求模(8位无符号校验和)。
   static void get_packet(char *buffer)
  {
       do {
                       //数据包以 ‘$’ 符号开始
                      while ((ch = (gdbstub_read_wait())) != ‘$’)
                      /* nothing */;
                     //数据包以 ‘#’ 符号结束 ,中间数据部分是对调试真正有意义的
                    while (count < (BUFMAX – 1)) {
                    ch = gdbstub_read_wait();
                     if (ch == ‘#’)
                               break;
                      checksum = checksum + ch;
                       buffer[count] = ch;
                       count = count + 1;
             }
              buffer[count] = 0;
                //再接收两个数据,判断其校验是否与我们计算的相一致
              if (ch == ‘#’) {
              xmitcsum = hex(gdbstub_read_wait()) << 4;
              xmitcsum += hex(gdbstub_read_wait());

if (checksum != xmitcsum)
                     /* failed checksum */
                     dbg_io_ops->write_char(‘-’);
             else
                    /* successful transfer */
                    dbg_io_ops->write_char(‘+’);
              if (dbg_io_ops->flush)
                    dbg_io_ops->flush();
         }
    } while (checksum != xmitcsum);   //直到接收完正确校验的数据报才开始,去调用处理函数
}
3
      由于Remote Serial Protocol协议相对来说比较简单,
      建议协议复杂点的话,需要用的状态机,会比较简单明了。

kgdb接收一个数据包详解的更多相关文章

  1. HTTP数据包详解

     无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看. 阅读目录 ...

  2. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  3. TCP通讯处理粘包详解

    TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...

  4. R1(上)—R关联规则分析之Arules包详解

    Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...

  5. 输入一个url全过程详解

    1. 用户在浏览器中输入url,浏览器接收到url. 2.浏览器接收到这个url之后,会根据这个url会先查看缓存,如果有缓存且没有过期的话直接提供给客户端,完成页面渲染. 3.否则浏览器就会通过DN ...

  6. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  7. ContentProvider数据访问详解

    ContentProvider数据访问详解 Android官方指出的数据存储方式总共有五种:Shared Preferences.网络存储.文件存储.外储存储.SQLite,这些存储方式一般都只是在一 ...

  8. Spring各个jar包详解

    Spring各jar包详解 spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar,aspects.jar, spring-portlet.jar, and sprin ...

  9. spring-jar包详解整理(大合集)

    转:https://blog.csdn.net/weisong530624687/article/details/50888094 spring.jar 是包含有完整发布模块的单个jar 包.但是不包 ...

随机推荐

  1. jQuery如何设置自增自减值

    一直不是很记得jquery中怎么设置自增值,比如当点击按钮时 div在当前宽度基础上增加宽度100px,可以这样写: $('button.test').click(function(){ $('div ...

  2. Android学习笔记:多个AsyncTask实例的并发问题

    AsyncTask是Android给开发者提供的一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程让在后台做一些耗时的操作(如IO操作.网络访问等),并在这个过程中更新UI.之所以说它轻量级, ...

  3. Python关键字yield详解以及Iterable 和Iterator区别

    迭代器(Iterator) 为了理解yield是什么,首先要明白生成器(generator)是什么,在讲生成器之前先说说迭代器(iterator),当创建一个列表(list)时,你可以逐个的读取每一项 ...

  4. 基于visual Studio2013解决算法导论之025双向循环链表

     题目 双向循环链表 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...

  5. 使用线程新建WPF窗体(公用进度条窗体)

    使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...

  6. oracle db server 改动主机名时的注意事项

    參考: Configuring The DB After Host Name Change (Doc ID 465545.1) 总结要点例如以下: 1. 注意改动listener.ora 和tnsna ...

  7. Ubuntu 12.04 安装JDK 8和Eclipse

    Ubuntu 12.04 下安装 JDK8 方法一:(缺点是安装时附加openjdk等大量程序并无法去除,长处是安装简单) $ sudo apt-get install eclipse 方法二:(长处 ...

  8. #define DEBUG用法

    背景: 很多时候我们写代码,想要看看函数或者算法执行的对不对.是否达到了我们想要的效果, 那么,最直接的办法是把函数或者算法所操作数据显示出来看看,这样就需要写一些cout<<直接输出的代 ...

  9. 使用SHA1、SHA2双证书进行微软数字签名

    微软是第一个宣布了SHA-1弃用计划,在2016年之后Windows和IE将不再信任SHA-1证书.正好我们公司的数字签名也到期了,索性就重新申请了sha256和sha1的新数字证书,用来给产品签名. ...

  10. Qt学习之路(60): 创建shared library

    前段时间说了Qt一些类库的使用,今天来换一下口味,来看一下程序设计的问题.今天来说的是关于共享库 shared library. 如果你打开一些 Windows 应用程序的目录,你会发现有很多程序的 ...