shell学习一:shell命令行实现

发布者:温暖心情最新更新时间:2024-12-12 来源: elecfans关键字:shell  命令行  s5pv210芯片 手机看文章 扫描二维码
随时随地手机看文章

1:以s5pv210芯片的开发板为例。标准输入输出设置为串口的输入输出,通过开发板串口连接PC主机,使用SecureCRT软件,来构建一个类似uboot中的shell命令行界面;


2:shell命令行界面的实质就是提供人机交互,类似GUI、xwindows等;


shell命令行界面的实现原理:


利用一个while死循环构建一个命令行终端,这个命令行终端可以读取、解析命令、并介串口来输出,把结果在SecureCRT中打印出来;


需要如下几个函数:start.S 用来做基本的初始化:如关开门狗、电源置锁、初始化时钟、初始化DDR等;


接下来初始化串口,构建一个以串口输入输出的标准化函数;


下面这段代码初始化了串口,并且构建了以串口为输入、输出的函数putc、getc


#define GPA1CON     0xE0200020

#define ULCON2        0xE2900800

#define UBRDIV2        0xE2900828

#define UDIVSLOT2    0xE290082C

#define    UCON2        0xE2900804

#define    UFCON2        0xE2900808

#define    UMCON2        0xE290080C

#define UTXH2        0xE2900820

#define UTRSTAT2    0xE2900810

#define URXH2        0xE2900824


#define rGPA1CON    (*(unsigned int*)0xE0200020)

#define rULCON2        (*(unsigned int*)0xE2900800)

#define rUBRDIV2    (*(unsigned int*)0xE2900828)

#define rUDIVSLOT2    (*(unsigned int*)0xE290082C)

#define rUCON2        (*(unsigned int*)0xE2900804)

#define rUFCON2        (*(unsigned int*)0xE2900808)

#define rUMCON2        (*(unsigned int*)0xE290080C) 

#define rUTXH2        (*(unsigned int*)0xE2900820) 

#define rUTRSTAT2    (*(unsigned int*)0xE2900810)

#define rURXH2        (*(unsigned int*)0xE2900824)

 

void uart_init(void)

{

    //设置线接口为Rx Tx 模式       GPA1CON, R/W, Address = 0xE020_0020    

    rGPA1CON &= ~(0xFF);

    rGPA1CON |= 0x22;    

    //设置ULCON                  8字节 无奇偶校验 终止位为1位 无起始 ULCON2, R/W, Address = 0xE290_0800

    rULCON2 = 0x3;

    //设置UCON                    UCON2, R/W, Address = 0xE290_0804, R/W, Address = 0xE290_0804

    rUCON2 = 0x5;

    //设置UFCON    无FIFO            UFCON2, R/W, Address = 0xE290_0808

    rUFCON2 = 0x0;

    //设置UMCON    无流控            UMCON2, R/W, Address = 0xE290_080C

    rUMCON2 = 0x0;

    //设置波特率   UBRDIV2, R/W, Address = 0xE290_0828   UDIVSLOT2, R/W, Address = 0xE290_082C

    rUBRDIV2 = 0x23;

    rUDIVSLOT2 = 0x0808;

        

}

#if 0

#define GPA0CON        0xE0200000

#define UCON0         0xE2900004

#define ULCON0         0xE2900000

#define UMCON0         0xE290000C

#define UFCON0         0xE2900008

#define UBRDIV0     0xE2900028

#define UDIVSLOT0    0xE290002C

#define UTRSTAT0    0xE2900010

#define UTXH0        0xE2900020    

#define URXH0        0xE2900024    


#define rGPA0CON    (*(volatile unsigned int *)GPA0CON)

#define rUCON0        (*(volatile unsigned int *)UCON0)

#define rULCON0        (*(volatile unsigned int *)ULCON0)

#define rUMCON0        (*(volatile unsigned int *)UMCON0)

#define rUFCON0        (*(volatile unsigned int *)UFCON0)

#define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)

#define rUDIVSLOT0    (*(volatile unsigned int *)UDIVSLOT0)

#define rUTRSTAT0    (*(volatile unsigned int *)UTRSTAT0)

#define rUTXH0        (*(volatile unsigned int *)UTXH0)

#define rURXH0        (*(volatile unsigned int *)URXH0)


// 串口初始化程序

void uart_init(void)

{

    // 初始化Tx Rx对应的GPIO引脚

    rGPA0CON &= ~(0xff<<0);            // 把寄存器的bit0~7全部清零

    rGPA0CON |= 0x00000022;            // 0b0010, Rx Tx

    

    // 几个关键寄存器的设置

    rULCON0 = 0x3;

    rUCON0 = 0x5;

    rUMCON0 = 0;

    rUFCON0 = 0;

    

    // 波特率设置    DIV_VAL = (PCLK / (bps x 16))-1

    // PCLK_PSYS用66MHz算        余数0.8

    //rUBRDIV0 = 34;    

    //rUDIVSLOT0 = 0xdfdd;

    

    // PCLK_PSYS用66.7MHz算        余数0.18

    // DIV_VAL = (66700000/(115200*16)-1) = 35.18

    rUBRDIV0 = 35;

    // (rUDIVSLOT中的1的个数)/16=上一步计算的余数=0.18

    // (rUDIVSLOT中的1的个数 = 16*0.18= 2.88 = 3

    rUDIVSLOT0 = 0x0888;        // 3个1,查官方推荐表得到这个数字

}

#endif


void putc(char ch)

{

    //直接写入 UTX2就可以然后自动发送 UTXH2, W, Address = 0xE290_0820

    //以轮询的方式发送检查是否已经发送完成        UTRSTAT2, R, Address = 0xE290_0810

    

    if (ch == 'n') {

        while (!(rUTRSTAT2 & (0x1<<1)));

        rUTXH2 = (unsigned int)('r');

    }

    while (!(rUTRSTAT2 & (0x1<<1)));

    rUTXH2 = (unsigned int)ch;

    

}



char getc(void)

{

    //        URXH2, R, Address = 0xE290_0824

    while (!(rUTRSTAT2 & (1<<0)));

    return (rURXH2 & 0xFF);

}


第二部构建两个函数puts打印字符串、gets读取字符串、


void puts(const char *pch)

{

    while ((*pch)!='�') {

        putc(*pch);

        pch++;

    }

}


char *gets(char *pbuf)

{

    char *p = pbuf;

    

    while ((*pbuf = getc()) != 'r') {        //window中用键盘输入的回撤为/r/n

                                            //所以判断是否输入回撤时要判断是否为/r        

        if (*pbuf != 'b') {            

            putc(*pbuf);            

            *pbuf++;

        }

        else {

            if(pbuf > p) {

                putc('b');                        //这段代码是用来实现回显

                putc(' ');                        //如果是b的话putc b,然后在输入空格把原来的字符删除

                putc('b');                        //在输出b会原位。            

                pbuf--;    

            }

                    

        }

        

    }

    *pbuf = '�';    

    putc('n');

    return p;

    

}



void* memset(void *buf, int c, int n)

{

    int i = 0;

    char *p = (char*)buf; 

    

    while (i < n) {

        *p = (char)c;

        i++;

        p++;

    }

    return buf;    

}


#include 'stdio.h'


int main(void)

{

    char buf[100];

    //初始化时钟

    clock_init();    

    

    //初始化uart        

    uart_init();

    puts('x210_shell:n');

    while (1) {

        puts('210x_bhc#');

        memset(buf, 0, sizeof(buf));        

        gets(buf);

        puts('210x_bhc#what you put is ');

        puts(buf);    

        puts('n');

        

        

    }    

    return 0;

}


这样就实现了一个简单的命令行回显功能,之后再加入命令。。下章继续。


关键字:shell  命令行  s5pv210芯片 引用地址:shell学习一:shell命令行实现

上一篇:S5PV210 uboot中的 MMU代码分析
下一篇:S5PV210_时钟系统

推荐阅读最新更新时间:2026-03-23 18:12

【ARM】S5PV210芯片中的BL0的作用
S5PV210芯片中的BL0的作用: (1)关闭看门狗; (2)清除指令寄存器; (3)初始化栈区域; (4)初始化堆区域; (5)初始化块设备复制功能; (6)初始化PLL和设置系统时钟; (7)拷贝BL1到片内SRAM; (8)验证BL1校验,如果校验失败,最后将二次开机; (9)检查是否是安全启动模式。 如果安全关键值写入S5PV210,它的安全启动模式。 如果它是安全的启动模式,验证BL1的完整性。 (10)跳到BL1的开始地址;
[单片机]
ARM芯片开发学习(S5PV210)——icache、dcache介绍和如何开关icache
什么是icache、dcache cache是高速缓冲存储器,icache(instructions cache)是指令高速缓冲存储器,dcache(data cache)是数据高速缓冲存储器。存储介质的基本规律是读写速度越快单位存储容量的价格就越高,为了平衡存储速度和价格,计算机的采用分级的存储系统,按照读写速度由快到慢:CPU- 寄存器- cache- 内存- 外存。其中寄存器是在集成到Soc内部的,直接和CPU交互数据,数量有限;在性能高一些的计算机中,cache是可以采用多级的;内存一般是RAM,外存可以是磁盘、flash等。其中icache和dcache就是属于cache,icache用于缓存指令,dcache用于缓存数
[单片机]
记录ok6410 jlink 命令行调试uboot
1启动ok6410 进入uboot命令行 2\启动JLinkGDBServer -device ARM11 3arm-none-eabi-gdb u-boot 初始化脚本 # Connect to the J-Link GDBServer target remote localhost:2331 # Set JTAG speed to 30 kHz monitor endian little monitor speed 30 # Reset the target monitor reset monitor sleep 10 # # CPU core initialization # # Set the processor to s
[单片机]
玩转mini2440开发板之【如何通过vivi的命令行来启动nfs网络文件系统】
前文中说到如何开启了ubuntu 12.04的nfs网络文件系统,那么今天就接下去研究一下如何使用友善之臂的mini2440开发板来进行nfs网络文件系统的启动加载。 如前所述,已经在ubuntu上面配置好了nfs文件系统的目录和服务。我的nfs目录是/opt/FriendlyARM/mini2440/rootfs /mnt/nfs。 此时,根据mini2440的开发板操作手册,便可直接启动开发板,使用nand模式启动,接好电源、串口和网线,上电,便可看到开发板输出的调试信息: ##### FriendlyARM BIOS for 2440 ##### bon part 0 320k 2368k Download
[单片机]
PICC18编译器命令行驱动及其应用
简介:PIC18F系列产品是美国微芯科技公司的高档产品,用户多采用C语言进行编程设计, 大部分应用者使用MPLAB集成环境进行编程,在一些重要或大型应用的开发中有一些问题。例如,如何编写C语言的库文件,如何对有代码限制的程序进行编译等,若只是采用传统方式编程,则达不到应有的效果。本文所阐述的HI-TECH C编译器的PICCl8命令行驱动,正是要解决这些问题。 1 HI-TECH C编译器 HI-TECH C编译器提供了C语言的标准特性,同时还加上许多为了适应PIC系列单片机的特定硬件特性而设计的扩展功能,并与汇编器集成在一起提供共享链接器和库管理工具,因而应用较为广泛。 当编译一个程序时,就有许多操作既可由命令行驱动
[单片机]
PICC18编译器<font color='red'>命令行</font>驱动及其应用
基于HI-TECH C编译器的PICC18命令行驱动
PICl8F系列产品是美国微芯科技公司的高档产品,用户多采用C语言进行编程设计,HI-TECH SoftwarePty.Ltd.公司的PICC18编译器得到了广泛应用。大部分应用者使用MPLAB集成环境进行编程(见参考文献),在一些重要或大型应用的开发中有一些问题。例如,如何编写C语言的库文件,如何对有代码限制的程序进行编译等,若只是采用传统方式编程,则达不到应有的效果。本文所阐述的HI-TECH C编译器的PICC18命令行驱动,正是要解决这些问题。 1 HI-TECH C编译器 HI-TECH C编译器提供了C语言的标准特性,同时还加上许多为了适应PIC系列单片机的特定硬件特性而设计的扩展功能,并与汇编器集成在一起提供共享
[单片机]
基于HI-TECH C编译器的PICC18<font color='red'>命令行</font>驱动
迅为imx6ull开发板使用c语言调用shell命令控制led灯
用命令来控制 led 灯没有感觉,那可以使用程序来控制,让程序帮我们输入这些命令,我们可以使用system 函数来完成。 头文件:#include 格式:system(要执行的命令) 代码实现: #include void main(void) { system(“echo none /sys/class/leds/sys-led/trigger”);//设置触发方式 while(1) { system(“echo 1 /sys/class/leds/sys-led/brightness”);//点亮 led2 sleep(5); system(“echo 0 /sys/class/leds/sys-led/brightne
[单片机]
迅为imx6ull开发板使用c语言调用<font color='red'>shell</font>命令控制led灯
tiny4412 串口驱动分析九 --- shell终端
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 在上面我们知道了/dev/ttySACx是如何生成的,此外还可以看到在/dev下还有设备结点/dev/console,以及/dev/tty等设备结点。 可以看到向/dev/ttySAC0、/dev/console和/dev/tty输入字符,然后这些字符会输出到串口终端上: 但是如果使用adb shell登陆后,现象不同: 其中,左边的窗口是在ad
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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