从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)

2023-05-16

// 此函数有以下几点值得注意:
// 1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该
//    参数内容(一般是指针指向的内容),则可以声明为const。
// 2、第二个参数。C语言中函数只能有一个返回值,但是有时候我们希望从函数中得到不止一个返回内容怎
//    么办呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数
//     输出信息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样
//    在函数调用完成后,用户即可到endp指针处去取函数传出的值了。这就是用参数实现返回值的方式。但是
//     要注意,在函数中千万不可把局部变量的地址传给输出型指针,因为局部变量存在栈里,函数调用结束后
//     即释放了,传出的指针指向的内容是栈上已经被释放的部分,因此是无效的。(PS:高级语言中
//     譬如C#有ref,out关键字,以明确指明该引用为输出型)
// 3、第三个参数base。要注意这个base的机制,本函数中是按照这样的理念来设计的。即如果str中有0x
//     开头且接下来是数字则忽略用户调用时输入的base,强制为16进制。如果str不是上面情况然后才看用户
//    输入的base。用户输入非0则使用用户指定的base,若用户输入0则自动判断是8进制还是10进制。
//     需要强调的是:使用习惯决定理念,理念决定代码逻辑。
// 4、注意 if(endp)这里,在输出型参数使用中,函数内首先判断endp是否为NULL,并以此来决定是否输出
//    这个机制来自于一个理念:这个输出参数有可能是用户关注的,也有可能是用户不在意的。这样处理可以
//     给用户自由,即用户如果在意就传一个有效指针过来接收;如果不在意调用时直接给个NULL就行。提供

//     服务但不强迫,这样很好。在OS的API中很多时候都有类似的技巧,请注意体会。


unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
{
    unsigned long result = 0,value;
// 对于base,首先如果*cp以0x开头且下来是数字,则一定为16进制。
// 然后如果用户指定了一个非0的进制,则遵循用户输入的进制。如果用户输入了0进制,则根据是否0开头来
// 确定是8进制还是10进制
    if (*cp == '0') {
        cp++;
        if ((*cp == 'x') && isxdigit(cp[1])) {
            base = 16;            // 如果cp是0x开头的,下面一个又是数字,那么base一定为16.此时即使
            cp++;                // 用户输入了一个base,也忽略这个base而强制其为16
        }
        if (!base) {
            base = 8;            // 如果用户输入base为0,cp是0开头,接下来不是x,
        }                        // 那么强制为8进制
    }
    if (!base) {
        base = 10;                // 如果用户输入base为0,cp是非0开头,则使用10进制。
    }
    // while循环里value<base是精髓所在。这个解析停止的条件不能是null,而应该是str中第一个不是
    // 数字的字母。这个字母的范围取决于base,譬如如果是16进制那么f也算是数字。而如果是8进制那么
    // 9都不算是数字了。因此解析结束的范围只能和base比较来限定。
    while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
        ? toupper(*cp) : *cp)-'A'+10) < base) {
        result = result*base + value;
        cp++;
    }
    if (endp)        // 此处if判断的作用是:用户在使用这个函数时,如果不关心endp则可以直接使用
        *endp = (char *)cp;        // null,而不必担心程序运行会出错。这种处理技巧很实用,用户可以
        return result;        // 自行决定是否使用这个函数提供的参数式返回值。
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul) 的相关文章

  • 三星S5P6818之UBOOT网络配置

    三星S5P6818之UBOOT网络配置 使用友善提供的固件烧写到SD卡发现UBOOT并不能联网 于是研究了UBOOT源码 并调通了网络 以下步骤亲测可用 前言 这个适合友善nanopi3系列的开发板 M3 Fire3 T3等 或者其他使用
  • Uboot 编译失败问题

    编译失败问题汇总 索引 一 已经有uboot源码 并且有 build sh 的情况 一 已经有uboot源码 并且有 build sh 的情况 首先Makefile 没有配置编译器 导致的错误 错误提示信息如下 cc1 error bad
  • 3.移植uboot-使板卡支持nor、nand

    在上一章 我们添加了nor nand启动后 uboot启动出如下图所示 上面的Flash failed 是属于uboot第二阶段函数board init r 里的代码 代码如下所示 位于arch arm lib board c 第二阶段 v
  • 2.移植uboot-添加2440单板,并实现NOR、NAND启动

    1 首先在uboot里新建单板2440 1 1将2410的单板文件夹拷贝成2440 cd board samsung cp smdk2410 smdk2440 rf 拷贝文件夹 然后将smdk2440下的smdk2410 c改为smdk24
  • IMX6ULL NXP官方原版u-boot编译烧录体验以及出现的问题

    编译 guangjie ubuntu work imx6ull uboot imx rel imx 4 1 15 2 1 0 ga xgj cat make imx6ull emmc sh bin bash make ARCH arm CR
  • 运行 make menuconfig 报ncurses相关错误

    HOSTCC scripts basic fixdep scripts basic fixdep c In function traps scripts basic fixdep c 377 warning dereferencing ty
  • windows Caffe 动态库 静态库 编译教程

    博主所在的教研室要使用Caffe实现机械臂的控制环节中的预测部分 其中涉及到了Caffe的编译以及LSTM层的添加到最终的caffe的动态库和静态库的编译及使用 整个过程一言难尽 特写此博客纪念 首先是caffe的编译 网上的教程都是大同小
  • uboot启动第二阶段——C语言

    1 给全局变量gd分配内存 详情参考 uboot中重要的全局变量 gd 2 计算重定位的代码长度 armboot start word start monitor flash len bss start armboot start 要重定位
  • GNU风格 汇编语法总结

    汇编源程序一般用于系统最基本的初始化 初始化堆栈指针 设置页表 操作 ARM的协处理器等 这些初始化工作完成后就可以跳转到C代码main函数中执行 1 GNU汇编语言语句格式 任何Linux汇编行都是如下结构
  • 高合汽车旗下可进化超跑SUV高合HiPhi X亮相海口国际新能源车展

    2021年1月8日 高端新能源智能出行品牌高合汽车旗下高合HiPhi X亮相第三届海口国际新能源汽车展览会 华人运通高合汽车创始人丁磊在现场透露 上市至今高合HiPhi X限量3000辆创始版车型即将预订售罄 累计收获了32000多位留资用
  • printf,sprintf,sprintf_s,_snprintf_s,vsprintf,vsnprintf,_vsnprintf_s,_vscprintf等格式化字符串使用与区别

    最近在为新做的项目找个好用的第三方日志库 感觉log4cpp挺好用的 日志输出使用了格式化字符串 不同的函数功能不同 而且变异版本比较多 自己都有点搞昏了 网上搜索也比较笼统 下面是自己coding测试格式化字符串的过程 vs2015 wi
  • X210开发板(S5PV210芯片)uboot中SD卡分区分析(init_raw_area_table函数)

    1 init raw area table函数调用关系 start s start armboot mmc initialize mmc init mmc startup init raw area table 2 struct raw a
  • 将uboot,kernel,rootfs下载到开发板上

    1 为什么要下载 所谓下载 也称烧录 部署 1 1 什么是u boot Hi3518EV200 单板的 Bootloader 采用 U boot u boot是一种普遍用于嵌入式系统中的Bootloader Bootloader是在操作系统
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 致命错误 LNK1104:无法打开文件“libboost_log-vc141-mt-gd-1_64.lib”

    我正在编写一个利用 Boost 日志记录功能的程序 因此 当尝试构建该程序时 在生成代码时出现以下错误 在 Visual Studio 2017 上 1 gt LINK 致命错误 LNK1104 无法打开文件 libboost log vc
  • 实现自定义 u-boot 命令

    我想添加自定义命令命令u boot可以是一个简单的 hello world 命令 搜索后我发现了这个链接Yocto u boot 自定义命令它说看的地方timer命令输入cmd misc c作为起点 我怎么带这个timer命令到我的 u b
  • lv12 uboot源码配置编译 8

    目录 1 uboot源码获取 2 uboot特定 3 uboot源码结构 3 1 平台相关代码 3 1 1 arch 3 1 2 board 3 2 平台无关代码 3 2 1 common下放的都是uboot的命令 3 3 配置文件 帮助文
  • 在 Xcode 10 中找不到 -lstdc++.6 的库

    我无法在 Xcode Beta 和 GM 版本中构建基于 Cordova 的 iOS 应用程序 因为在此项目中使用 lstdc 6 为什么因为苹果已经弃用了 lstdc 6这个库在较新的 Xcode 版本中 所以我已经从Link Binar
  • 为什么从 .dll 导入函数时需要 .lib 文件?

    你能帮我理解 为什么从 dll 导入函数和数据时需要 lib 文件吗 我听说它包含来自相应 dll 的导出函数和数据元素的列表 但是当我使用 CFF Explorer 探索我的 dll 时 我发现 dll 已经具有导出函数的地址 因此理论上
  • u-boot:搬迁

    这是一个与u boot相关的基本问题 为什么 u boot 代码会自行重新定位 好吧 如果 u boot 是从 NOR flash 或启动 ROM 空间执行 那么这是有道理的 但如果它已经从 SDRAM 运行 为什么它必须再次重新定位自己呢

随机推荐

  • 深度学习图像分类实战——pytorch搭建卷积神经网络(AlexNet, LeNet, ResNet50)进行场景图像分类(详细)

    目录 1 一 实验过程 1 1 实验目的 1 2 实验简介 1 3 数据集的介绍 1 4 一 LeNet5网络模型 1 5 二 AlexNet网络模型 1 6 三 ResNet50 xff08 残差网络 xff09 网络模型 二 实验代码
  • c++实现经典游戏贪吃蛇(超详解)

    经典版 要求 xff1a 1碰到四周和自身游戏结束 xff1b 2迟到食物蛇身增长 xff1b 3食物吃得越多游戏越快 xff1b 4通过w a s d可控制蛇头的方向 xff1b 5蛇身颜色不一致 源码 xff08 需要easy x 贪吃
  • c++中求数组的长度

    c 43 43 中求数组的长度 数组长度 61 sizeof 数组名 sizeof 数组类型 span class token macro property span class token directive hash span span
  • 实验 1 UML 类图实验

    实验内容 作图工具 xff1a PowerDesigner 1 绘制以下类图并生成源代码 xff08 语言不限 xff09 xff1a 2 根据以下描述绘制类图 xff0c 再正向工程生成 Java 源代码 xff08 也可生成其他面 2
  • 贪吃蛇(C++)

    一 项目思路 该项目用于计算机软件课设 贪吃蛇要解决的问题有 xff1a 蛇身的移动 xff0c 事物的随机生成 xff0c 蛇头与食物重合 xff0c 蛇吃食物身体的变长 蛇身移动的处理可以改变蛇首元素 xff08 蛇身用数组存储 xff
  • C语言编程工具Dev C++的安装教程

    一 Dev C 43 43 安装包 xff08 5 11版本 xff09 无偿分享 Dev C 43 43 5 11 简体中文版下载地址 xff1a 百度网盘 xff1a 链接 xff1a https pan baidu com s 1Yb
  • winform基础 C#编程

    1 winform应用程序是一种智能客户端技术 xff0c 帮助我们获得信息或者传输信息 2 当后台需要获取前台控件属性 xff0c 需要使用Name属性 visible 指示一个空间是否可见 enabled 指示一个空间是否可用 3 事件
  • 联合索引为啥需要满足最左前缀原则?

    在回答这个问题之前 首先需要先了解清楚何为联合索引 联合索引就是MySQL设计大叔为了节省内存而创建的将多个列的值作为非叶子节点存储的B 43 树结构 比如按照key part1 key part2 key part3列创建了idx key
  • 堆栈和变量的分配区域

    转载自 http mengren425 blog 163 com blog static 56903931200791003721118 一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区
  • 2023海南大学835软件工程原理方法与应用考研总结

    不知不觉23考研已经结束一个星期了 xff0c 考试的过程还历历在目 政治复习虽然看完了徐的视频 xff0c 刷完了1000题 xff0c 写了肖8肖4 xff0c 背了肖4大题 xff0c 但选择题写的时候还是十分纠结 xff0c 用了一
  • vue 封装 axios 请求

    需求 xff1a 向后端请求拿数据 好处 xff1a 把所有的请求方法放在一个文件夹里面 xff0c 方便优化 先把 axios 安装起 npm install axios save 接下来按照步骤走吧 go go go 1 在src路径下
  • Python:从清华源安装第三方库

    python 在使用pip安装的时候 xff0c 一些小一点的还好 xff0c 安装一些大的包的时候 xff0c 会非常的慢甚至出现timeout的报错 xff0c 这时我们就可以使用清华大学的镜像来安装 xff0c 打开终端 xff1a
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • 关于VMware USB arbitration Serve 服务无法启动的问题

    文章目录 问题方法一方法二 问题 虚拟机插入U盘或者PA等其他USB设备时无法识别 xff0c 经过一番查询发现是本机的VMware USB arbitration Serve 没有启动 xff0c 然后 打开以后尝试启动VMware US
  • keil5安装记录(基于stm32芯片配置)

    参考资料地址正点原子 下载上述地址中的文件 xff0c 根据自己芯片的型号下载 xff0c 如仅安装keil仅下载网盘中的 软件资料 即可 xff0c 同时也可在官网下载 xff0c 但是不推荐下载最新版本 xff0c 因为很多报错没有可参
  • 黎曼几何与黎曼流形

    目录 0 黎曼几何 1 欧几里得几何与黎曼几何的区别 2 黎曼流形 3 黎曼距离 4 切空间 5 黎曼均值 6 SPD矩阵如何形成黎曼流型 7 切线空间映射 8 同余变换和同余不变 9 黎曼对齐 科普性笔记 xff0c 做了解 xff0c
  • Faster R-CNN

    1 论文简介 论文名 xff1a Faster R CNN Towards Real Time Object Detection with Region Proposal Networks 论文地址 xff1a Faster R CNN 论
  • 手把手教你安装VSCode(附带图解步骤)

    一 前端工具vscode 1 1 概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程 xff0c 通过HTML xff0c CSS及JavaScript以及衍生出来的各种技术 框架 解决方案 xff0c 来实现互联网产品的用户
  • 前端小知识:1.A标签的用法

    前端小知识 1 A标签的用法 Hello xff0c 大家好 xff0c 我是仲桉君 因为一些不可抗因素停更了很久 xff0c 但是我还是回来了从今天开始正式开始更新 这个系列是有关一些前端的小知识的小博文 预计更新20篇以上 争取做到每日
  • 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)

    此函数有以下几点值得注意 xff1a 1 第一个参数中的const 一般在函数的形参中 xff0c 如果我们只是希望调用者使用该参数 xff0c 而不会去改变该 参数内容 xff08 一般是指针指向的内容 xff09 xff0c 则可以声明