基于S3C6410的ARM11学习(十八) 移植printf和scanf

发布者:恬淡如云最新更新时间:2021-02-09 来源: eefocus关键字:S3C6410  ARM11  bootloader 手机看文章 扫描二维码
随时随地手机看文章

在学c语言的时候,经典的hello world程序,是通过printf函数实现了。有了这个函数,就可以随意的向屏幕打印数据了。在嵌入式中,其实也是可以用printf函数的,不过需要稍微麻烦点的移植。毕竟,在嵌入式中,所有实现的都要自己来弄,不在向PC程序开发一样,很多库函数,操作系统已经搞好,就用就行了。


首先,是要去下载能实现printf的源代码。这里用的是国嵌提供的。有两个文件夹,一个include,里面一些头文件,另外一个lib,实现printf的需要的额外的程序。

        clip_image006

        image

         image

中间的是inlcude中的头文件,下边是lib中的文件。


在lib中有一个Makefile。这个Makefile就是用来编译这些代码的,将所有的代码生成.o文件。供主函数链接使用。


可以发现,怎么没有printf.c文件了。那是因为这个printf.c文件是要我们自己来编写的。也就是printf函数和scanf函数要我们自己来写的,不过写的时候,可以使用lib中的一些函数来简化编写。

clip_image008

以上是printf的代码,使用一个数组来保存最终转化出来的字符串,大小是1024个字节。根据需要,这个大小可以更改。


函数的主要部分就是变参的处理。Printf是一个变参的函数,即函数的参数是不固定的。但是第一个参数是知道的,是一个字符串,通过这个字符串,可以知道有几个参数,从而在对这些参数进行处理。


va_start。提取字符串中的参数,即看%d,%c这些。知道有哪些参数。然后将这些参数保存在args中。


vsprintf。通过原始字符串和参数,转换后写入到新的字符串outbuf中。


va_end。这个是固定的。目前不知道有什么用。


通过上面三个函数,就实现了pritf的输入字符串的处理了。下面就调用putc函数,将转换后的字符串依次发送到串口即可了。

clip_image009

以上是scanf的函数。和printf函数类似,不过是先接收串口接收的数据,然后再对数据进行处理。


最后就是关键的地方了,代码写好了,怎么编译了。这个时候就要用到lib中提供的Makefile了。

clip_image011

这个Makefile实现了对lib文件下的各个c代码编译。最终生成lib.o供外部调用。${CFLAGS}这个是外部定义的变量。


剩下就要修改外部的总的Makefile了。

clip_image013

第一行:定义一些目标,就是一些.o文件。链接的时候,就链接这些文件。一个start.o,对应之前写的bootloader的start.S。main.o就对应main.c。device/dev.o这个对应外设驱动的代码集合,如LED,外部中断,串口等等这些。lib/lib.o这个就对应上面说到在lib下生成的lib.o,集合了printf和scanf。


第二行:定义一个参数CFLAGS,这个参数供调用的Makefile使用的。Makefile也是可以调用其他makefile的,这个时候,上层的makefile可以定义参数供下层的makefile使用。定义的这个参数是编译选项用的,-fno-builtin是说函数不是内建的函数,有可能我们写的函数和编译器的内建函数的名字是一样的。-I指的是搜索的头文件的目录,这里指定include目下,因为在实现printf的时候,有调用include中的头文件,所以需要告诉编译器这些头文件在什么地方。使用-I参数。$(shell pwd)这个是shell中的一些用法,调用pwd命令,返回的值就是这个$(shell pwd)的值。


第三行:将定义的参数CFLAGS导出去,这样外部的makefile就可以使用这个参数了。在lib下的makefile中是有用到这个参数的。


5-16行:实现编译链接。


18-19行: 执行device下的makefile。make –C device指的是跳转到device目录下去执行makefile。后面的all是具体执行makefile的目标

21-22行:和上面的一样,跳转到lib目录下,执行makefile命令,目标是all。

25-29行:伪目标,清除文件使用的。

clip_image015

以上是主目录的结构。只有main,makefile,链接脚本,start四个代码。其他代码都给弄到对应的文件下去了。

clip_image017

在device下,是各个外设驱动的代码。里面也有一个makefile。

clip_image019

以上是内容,就是将各个外设的代码给编译链接成dev.o文件,供外部使用。


这样,只需在主目录下,执行make命令。需要的.bit就生成了。是不是很方便了。

clip_image021

这样,就可以在程序中直接使用printf和scanf函数了。下面就来做一个简单的控制台。

clip_image023

上面的东西比较熟悉吧,下载程序,或者执行一些操作的时候,就有这个界面了。然后我们输入不同的选择,开发板就执行对应的操作。下面就来实现这个简单的串口控制台。


假设有5个选项。

1、  LED亮

2、  LED灭

3、  发送,hello world

4、  发送,weiqi7777

5、  发送,chinaaet

输入其他选项的话,就发送,WRONG。

clip_image025

执行的效果。

clip_image027

这是不是有点uboot的雏形了。当然这个控制台还做得比较简单。只有简单的几个命令。学到后面可以加更多的命令。


当输入不同的命令,会执行对应的操作。

         clip_image029

 这样,一个简单的控制台就做好了,同时也移植好了printf和scanf了。


对比STM32


在STM32中也是可以使用printf和scanf函数的。不过移植起来就简单多了,因为MDK将这个实现printf和scanf的库给提供了,我们只要使用即可,不过还是需要简单的修改,因为printf默认是输出到屏幕的,但是嵌入式中哪有屏幕,所以需要重定向到串口。


在STM32中,要加入stdio.h头文件,这个头文件是不是很熟悉啊,那是当然了,在c语言学习中,这个库可是基本每个程序都有了,因为里面包括了printf和scanf啊。

clip_image031

当然这个stdio头文件和我们学c语言的那个头文件不一样,这个是为嵌入式用的。在MDK中修改,选择使用MicroLIB。

clip_image033

最后,重写fputc函数。

clip_image035

因为printf函数,最终是调用fputc函数,将字符串发出去的,所以我们重写fputc函数,就将数据通过串口发送出去了。


至于scanf,目前没有用到过,所以还不知道。有知道的,麻烦请告知下。


以上,就实现了最重要的一个函数printf和scanf函数的移植了。对于移植,我们只需要把别人做好的代码拿来,稍微修改即可了。

关键字:S3C6410  ARM11  bootloader 引用地址:基于S3C6410的ARM11学习(十八) 移植printf和scanf

上一篇:扩大ARM SoC的验证覆盖与缩短仿真时间
下一篇:基于S3C6410的ARM11学习(十七) 串口走起来

推荐阅读最新更新时间:2024-10-13 20:36

s3c6410时钟体系
S3C6410可以使用外部晶振( XXTIpll )(默认为12MHZ)和外部时钟( XEXTCLK )两种方式输入时钟信号。它由跳线OM 决定。S3C6410 默认的工作主频为12MHz(晶振频率),S3C6410有三个PLL,分别为APLL、MPLL和EPLL。其中APLL产生ACLK,给arm core使用。MPLL产生HCLK和PCLK。EPLL产生特殊的时钟,比如为USB提供48MHz时钟。 时钟初始化流程: 当锁相环配置好了后,处理器会进入lock time。这段时间是不工作的,之后会根据配置的进行工作。 根据上图,可以进行软件的设置,如下图: 一.设置lock time时,一般不去设置,使用默认值
[单片机]
<font color='red'>s3c6410</font>时钟体系
S3C6410嵌入式应用平台构建(六)——linux-3.14.4移植到OK6410-(Yaffs2文件制作)
本文主要讲怎用利用yaffs2工具和busybox制作yaffs2文件系统镜像。大多数都是参照网上的,目的在于记录学习,不做任何用途。 一、制作mkyaffs2image工具 进入yaffs2源码目录下utils目录,修改mkyaff2image.c,做如下修改: // Adjust these to match your NAND LAYOUT: #if 0 #define chunkSize 2048 #define spareSize 64 #define pagesPerBlock 64 #else #define chunkSize 4096 #define spareSize 218 #defin
[单片机]
TMS320C6000系列二次Bootloader的设计与实现
引 言 随着DSP(数字信号处理器)系统的广泛应用,其程序规模也随之不断扩大,使用芯片本身自带的Boot-loader通过Flash存储器来引导DSP程序,往往受到程序大小和结构的制约,比如程序很大超过厂商固化boot的范围,再如中断向量表的不同位置对程序boot跳转的影响,等等,因此越来越需要更加灵活的引导方式。 系统上电后,由引导程序将DSP的应用程序从该存储器引导到DSP应用板上的高速存储器(如内部SRAM、SDRAM等)中。由于Flash存储器具有电信号删除功能,且删除速度快,集成度高,因此已成为此种存储器的首选。由于Flash存储器的存取速度较慢,写入Flash存储器的程序将在系统上电时被DSP装载到快速的存储器中运
[嵌入式]
Bootloader在AT91RM9200系统中的实现
基于ARM920T核的AT91RM9200芯片以其丰富的内部外设,高达200MIPS的处理速度,以及它温度范围宽的特点,在工业控制领域嵌入式开发中大有应用的空间。Bootloader是用来引导操作系统的引导装载程序,用来初始化硬件设备、确立内存空间的映射,为最终引导操作系统内核提供一个合适的软硬件环境。它严重地依赖硬件环境,往往因使用的芯片、外部设备、操作系统的内核配置而不同,它的实现是嵌入式开发中必不可少的环节。 实现适合本系统的引导程序方法有两种:一是自行开发的bootloader,其特点是可以使这个程序在满足要求的基础上占用尽量的小的空间,但是工作量较大,开发周期延长,除了一些特殊要求的情况,工程开发中一般不会自行编写;二
[单片机]
<font color='red'>Bootloader</font>在AT91RM9200系统中的实现
2440的flash、linux、bootloader
开始拿到2440板的时候不知道norflash ,nandflash等等干什么的,还有SDRAM有是什么,还有linux系统装在哪里,怎么装,supervivi有是什么等等很多的问题,今天大概简单的理清楚这里关系。 首先分开flash与SDRAM,这俩个其实我们都使用过,flash,U盘就是一块flash,主要是掉电不易失,至于norflash和nandflash都是flash只是工艺,读写速度,性能,造价等等不同,一般说nandflash可以做的很大,现在大的可以有几G了,好多开发板上面都是1G的了,而且造价便宜,但是nandflash容易产生坏块。而norflash一般比较小,几M,造价比较贵,但是不容易产生坏块,性能较好
[单片机]
移动视频监控及定位系统的设计方案
  随着3G/4G移动通信网络和计算机技术的快速发展,移动互联网从很多方面改善了人们传统的生活方式,3G/4G移动网络具有带宽宽、广域广、高安全性等突出特点,能够突破安防行业长距离数字化无线监控一直以来难以简单实现的瓶颈,为无线视频监控开辟了一条新的道路。   本文设计的一种移动视频监控及定位系统,采用S3C6410处理器作为硬件基础,以Mediastream、Live555、VLC开源项目为核心,3G/4G移动通信网络作为网络传输媒介,采用H.264编解码方式实现视频的采集传输播放,并集成GPS模块进行位置数据的采集、传输、显示,实现移动目标的视频监控、定位功能,该系统的前端硬件设备小巧,易于使用。   系统原理   系统
[单片机]
移动视频监控及定位系统的设计方案
MC9S12XEP 的bootloader解析
MC9S12XEP 的bootloader 归纳总结 两个要点: 1.ROM不要重叠,bootloader的代码与用户应用代码不要重叠。各自设置各自的ROM区域; 2.bootloader有一部分代码是在RAM里运行的,所以RAM也不能重叠,RAM可以分为如下三种: a.) 堆栈区域; b.)bootloader代码变量区域; c.)bootloader 中断地址; 上述三种RAM类型,不可重叠。 先说bootloader部分,需要处理的步骤如下: a). 为 bootloader 划出ROM,(.prm文件修改) b). 为bootloader ROM里再划出一块区域,
[单片机]
怎么使用stm32写IAP的bootloader和APP
Stm32的bootloader和App的编写注意事项 1、 怎么分配bootloader和app的空间 2、 怎么得到数据和写入flash 3、 怎么从bootloader跳转到app 4、 怎么设置App的中断向量 5、 App中怎么生成bin文件 6、程序执行的流程 1、怎么分配bootloader和app的空间 因为我用的是stm32f103c8t6,它的flash的大小是64k,所以把它分成如上所示 0x08000000 ---0x0800 33FF分配给bootloader使用,大小是13k 0x0800 3400----0x080097FF分配给第一个APP的使用,大小是25k 0x08009800---
[单片机]
怎么使用stm32写IAP的<font color='red'>bootloader</font>和APP
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved