北邮研究生实验课程:ARM嵌入式系统开发实验--实验二--MX1 ADS开发板显示姓名

rt
楼主本学期选修本课程,实验过程中在本站找到
北邮实验:ARM实验板移植Linux操作系统,LCD显示汉字参考教程,但在实际实验阶段发现有该教程存在一定的缺点或讲述不清的地方,经修正后,楼主将自身从零开始的全部实验流程记录在此,以供参考。口才有限,若有表述不清的地方还望批评指正:


实验目的与内容:

实验目的:
    1. 熟悉点阵字库的使用
    2. 熟悉Linux操作系统的使用
    3. 熟悉ARM嵌入式系统开发的过程
实验内容:
    1. PC端gcc实现读HZK16点阵字库文件,显示自己的姓名,用*和空格显示。
    2. 安装交叉编译工具。
    3. 修改程序,交叉编译。
    4. 制作新的文件系统镜像、烧写。

一、安装32位ubuntu16.04

        本实验课上采用MX1 ADS开发板,ARM9架构,32位系统;目前绝大部分电脑和使用的ubuntu虚拟机都是64位,若采用64位系统进行试验,虽可以完成实验内容点1,但后续安装交叉编译工具、编译时会出现不兼容问题。

        建议从一开始就使用32位系统,防止做到后面各种问题导致心态崩掉。

        我参照VMware 安装Ubuntu 16.04 32位 全过程安装了32位的Ubuntu16.04。第三步的3、4不用做;若第三步换源时出现无法复制粘贴的问题,可参照下方链接连接解决。

        若安装完成后出现ubuntu无法全屏显示的问题(如下图)、无法粘贴复制的文本问题,可参考VMware中让Ubuntu全屏显示(也可解决虚拟机和主机的复制粘贴问题)解决。

已解决全屏显示问题及复制粘贴问题↓(若此时仍无法粘贴,关闭Ubuntu后重新启动即可

        至此,以完成系统安装

二、安装vscode(个人习惯vscode,实际不安装也可以)

        参照Ubuntu32位安装VScode(亲测有效)进行安装

三、PC端gcc实现读HZK16点阵字库文件,显示自己的姓名,用*和空格显示

        可参照文章开头链接中代码。但由于Ubuntu16.04的gcc版本为5.4.0,版本较低,编译过程中,申请gbArray时,虽然n为3,但实际分配给gbArray的大小远超过3,且值不为00,会导致在打印时出现一些莫名其妙的字符或空格,如下图红框内所示(在高版本的gcc上不会出现这个问题,Ubuntu20.04上没有该问题)

       

故对test.c进行修改:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "UTF-8toGB2312.c"

void LCD_ShowChar(u16* word)  
{
    FILE* fphzk = NULL;
    int i, j, k, p, offset;
    int flag;
    unsigned char left = *word >> 8, right = *word & 0x00ff;
    unsigned char buffer[32];
    fphzk = fopen("HZK16", "rb");
    if (fphzk == NULL) 
    {
        fprintf(stderr, "error hzk16\n");
    }
    offset = (94 * (unsigned int)(left - 0xa1) + (right - 0xa1)) * 32; 
    fseek(fphzk, offset, SEEK_SET);
    fread(buffer, 1, 32, fphzk);
    //一行2个字节,16行,32个字节
    for (j = 0; j < 16; j++) 
    {
        printf("\n");
        for (i = 0; i < 2; i++) 
        {
            for (k = 0; k < 8; k++) 
            {
                flag = buffer[j * 2 + i] & (0x80 >> k);
                printf("%s", flag ? "* " : "  ");
            }
        }
    }


    fclose(fphzk);
    fphzk = NULL;

}
void LCD_ShowString(u16* p,int n)
{
    while (*p > 0 && n >0)
    {
        LCD_ShowChar(p);
        p = p + 1;
        n = n - 1;
       //此处加了一个n,即有多少个汉字。由于在申请gbArray时,虽然n为3,但实际分配的大小远超过3,且值不为00,会导致在打印时出现一些莫名其妙的字符或空格
    }
}


int main()
{
    const char  name[] = "陈奇奇";
    int num = strlen(name);
    int n = num/3 ;

    u16 gbArray[n];

    Utf8ToGb2312(name, num, gbArray);
    LCD_ShowString((u16*)gbArray,n);
    return 0;
}

cp936.h与UTF-8toGB2312.c两个文件无需改动

新建ARM文件夹,将以上三个文件及下发的HZK16字库文件放在文件夹下,在该文件夹下打开terminal,输入gcc test.c -o test命令,在输入./test命令,即可在terminal上看到由*和空格组成的自己的姓名。

四、安装交叉编译工具

        1、重设root密码(如果忘了的话)

                使用sudo passwd root,后连续输入两次密码,密码不会显示出来

        2、安装交叉编译工具arm-linux-gcc

                1)sudo cp usr-local-arm-gcc.tar.gz /usr/local   将老师下发的usr-local-arm-gcc.tar.gz复制到   /usr/local   目录下

                2)cd /usr/local    转移目录   

                3)sudo tar -xzf usr-local-arm-gcc.tar.gz  解压缩

                4)配置环境:

                       terminal中输入vi /home/XXXX/.bash.profile     其中XXXX为用户名,例如我的是chenqiqi

                        在新打开文件中按“i”进入编辑模式,输入一下代码,配置路径

PATH=/usr/local/arm/arm-linux/bin/:/usr/local/arm/bin/:/usr/local/bin:$PATH
export PATH

                        先按“esc”,再输入:wq保存文件并退出

                        在terminal输入source /home/XXXX/.bash.profile,使路径配置立刻生效

                        为确保每次使用时不用重复配置环境,vi /home/chenqiqi/.bashrc  ,在最后一行输入“source /home/chenqiqi/.bash.profile”

                        输入arm-linux-gcc -v,若有下图显示则成功安装交叉编译工具。

                        如果vi编辑文件时上下左右键出现ABCD现象,逐行执行以下代码,安装vim编辑器:

sudo apt-get update
sudo apt-get remove vim-common
sudo apt-get install vim

此时在chenqiqi用户下,已经完成arm-linux-gcc工具的安装,注意:chenqiqi用户下gcc版本降为3.2.3,root下gcc版本仍为5.4.0

五、修改程序,交叉编译

        对于display代码中的问题进行修改,其中判断条件flag==1改为flag,由于falg是两个字节的与结果,当且仅当flag为0000_0001时,flag==1判断为真,否则判断均为假,即,当falg=0010_0000时,此时应该输出,但是flag此时不为“1”,故不显示。最终结果是只显示一个字16列中的第8列和第16列像素点。

#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<string.h>

#include <unistd.h>
#include "UTF-8toGB2312.c"
#define Black   0xFFFF
#define White   0x0000


unsigned short *fb=0;
void LCD_ShowChar(int x,int y,u16 *word)
{
    FILE* fphzk = NULL;
    int i, j, k, p, offset;
    int flag;
    unsigned char left = *word >> 8,right = *word & 0x00ff;      //区号,位号
    unsigned char buffer[32];
    fphzk = fopen("HZK16", "rb");
    if(fphzk == NULL)
        {
            fprintf(stderr, "error hzk16\n");
        }
    offset = (94 * (unsigned int)(left - 0xa1) + (right - 0xa1)) * 32;            //计算公式:[94*(区号-1)+(位号-1)]*一个字模占用的字节数。
    fseek(fphzk, offset, SEEK_SET);
    fread(buffer, 1, 32, fphzk);

    for(j = 0; j < 16; j++)
    {
	    printf("\n");        
	    for(i = 0; i < 2; i++)
        {
	         for(k = 0; k < 8; k ++)
             {
                flag = buffer[j*2 + i] & (0x80 >> k);
                printf("%s", flag?"* ":"  ");
                if(flag)//判断条件从flag == 1改为flag
                {
                    *(fb + (x + j * 2)*240 + y + i*16 + k*2) = Black;//xy交换位置
                }
             }
	    }
    }

    fclose(fphzk);
    fphzk = NULL;
}
void LCD_ShowString(int x,int y,u16 *p,int n)
{
    while(*p>0  && n > 0)
    {
        LCD_ShowChar(x,y,p);
        p = p + 1;
        x = x + 40;
        n = n - 1;
    }
}

void clearScreen()  //清屏
{
    int x,y;
    for(y = 0; y < 240; y++)
    {
        for(x = 0; x < 320; x++)
            {
                *( fb + y * 320 + x) = White;
            }
    }
}


int main()
{
    const char  name[] = "陈奇奇";
    int num = strlen(name);
	int n = num/3;
	u16 gbArray[n];
    Utf8ToGb2312(name,num,gbArray); 
    int fd_fb = 0;
    int x = 100, y = 140;
    fd_fb = open("/dev/fb0",O_RDWR,0);
    fb=(unsigned short*)mmap(NULL, 320*240*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd_fb, 0);
    clearScreen();
    LCD_ShowString(x, y, (u16*)gbArray, n);      
    return 0;

}

六、制作新的文件系统镜像、烧写

        1、首先执行gcc display.c -o display    和   arm-linux-gcc -o display display.c

        2、由于ubuntu版本问题,需要安装cramfs工具,工具在下方百度网盘内

                链接:https://pan.baidu.com/s/1x6JSxsZ2h8PlcZ4K8HCFwQ?pwd=5zcf 
                提取码:5zcf 

                将该压缩包放在ARM文件夹下,执行tar -xvf cramfs_1.1.tar.gz

        3、将下发的root.cramfs文件放到ARM文件夹内,在ARM文件夹内新建disk文件夹和newdisk文件夹

        4、mount -t cramfs -o loop root.cramfs disk,将 root 文件系统镜像Mount(挂载)到disk文件夹中

        5、sudo cp -rf disk/* newdisk,将 disk 目录内的整个 root 文件系统复制到一个新文件夹(例如,newdisk)

        6、umount disk,确定完整无误地复制了root文件系统后,Unmount(卸载)disk 内的文件系统

        7、在newdisk中新建ARM文件夹,在terminal中输入chmod 777 ARM

        8、apt install cramfsprogs,安装mkcramfs工具

        9、mkcramfs newdisk newroot.cramfs,生成一个新的 root 文件系统镜像

至此已完成个人pc上的所有操作,到实验室时只需要将自己生成的root文件系统下载到实验板上,

在LCD上观察是否实现预期结果。

以上是个人从零开始完成实验的全部过程,仅供参考,中间部分过程可能会有些繁琐,也是第一次接触虚拟机和ubuntu,若有不完美或者操作繁琐的地方还望海涵。

  

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一本介绍ARM开发工具,ADS的TXT类电子书,包含以下内容: 第1章 ARM调试方法和工具 1.1 调试原理概述 1.1.1 传统调试方法 1.1.2 ARM调试的特点 1.1.3 ARM调试原理 1.2 ARM调试方法 1.3 ARM开发工具介绍 1.3.1 ARM开发工具ADS 1.3.2 其他开发工具 第2章 ADS介绍 2.1 ADS的系统资源 2.1.1 ADS系统的组成 2.1.2 ADS系统所提供的文件 2.2 ADS系统中的文件类型 2.3 命令行方式和图形方式 2.3.1 命令行方式 2.3.2 图形方式 第3章 工程项目 3.1 工程项目和文件 3.1.1 建立一个工程项目 3.1.2 建立一个源文件 3.1.3 编辑新建立的源文件 3.1.4 把源文件加到工程项目中 3.2 工程项目管理 3.2.1 工程项目窗口 3.2.2 工程项目窗口中的级联菜单 3.2.3 工程项目管理 3.2.4 把文件分组 3.3 生成目标和生成选项 3.4 工程项目模板 3.4.1 关于ARM所提供的工程项目模板 3.4.2 把映像格式的工程项目转换成库工程项目 3.4.3 自己创建工程项目模板 3.5 复杂的工程项目 3.5.1 关于设置文件的搜索路径 3.5.2 关于生成目标 3.5.3 建立子工程项目 3.6 工程项目操作命令 第4章 文件和库 4.1 文件管理 4.1.1 文件管理方法 4.1.2 文件操作命令 4.1.3 文件比较 4.2 文件映射 4.3 系统头文件和用户头文件 4.4 ARM系统库 4.4.1 ARM运行时库(runtime libraries)概述 4.4.2 建立一个使用c/c++库的应用程序 4.4.3 建立一个不包含C库的应用程序 4.5 关于使用用户库 第5章 编辑器及浏览器 5.1 编辑器窗口功能介绍 5.2 搜索和替换操作 5.2.1 搜索和替换的方法 5.2.2 使用习惯表达式的一般规则 5.2.3 搜索操作命令 5.3 编辑操作命令 5.4 编辑器设置 5.4.1 编辑器设置面板 5.4.2 字体和制表符(Font&Tabs)设置面板 5.4.3 文本颜色(Text Colors)设置面板 5.4.4 为工程项目中的常用关键字设置颜色 5.5 浏览器 5.5.1 浏览器概述 5.5.2 浏览操作命令 5.6 浏览器视窗 5.6.1 分类视窗 5.6.2 目录视窗 5.6.3 分层视窗 5.7 浏览器应用 5.7.1 与浏览器有关的级联菜单 5.7.2 使用浏览器向导 第6章 汇编程序规则和汇编器应用 6.1 汇编程序规则 6.1.1 汇编语言程序的组成和格式 6.1.2 汇编语言程序中的表达式 6.1.3 预定义寄存器 6.2 汇编器使用方法 6.2.1 在命令行方式中使用汇编器 6.2.2 在图形方式中使用汇编器 6.2.3 汇编器中的可选项 6.3 设置汇编器的可选项 6.3.1 与目标有关的可选项 6.3.2 与ATPCS有关的选项 6.3.3 汇编器特性选项 6.3.4 关于预定义的有关选项 6.3.5 列表控制选项 6.3.6 附加选项 6.3.7 其他选项 6.4 汇编器应用 第7章 C/C++语言程序应用 7.1 编程规则 7.1.1 使用Pragmas 7.1.2 使用关键词 7.2 标准C/C++语言扩展 7.3 C/c++语言数据类型 7.4 C/C++语言和汇编语言混合编程 7.4.1 嵌入式汇编语言的用法 7.4.2 程序之间的相互调用 第8章 编译器的可选项设置及应用 8.1 编译器概述 8.1.1 编译器概述 8.1.2 编译器使用方法 8.1.3 ARM编译器在搜索文件时要注意的几个问题 8.2 编译器的可选项设置 8.2.1 Target and Source设置面板 8.2.2 ATPCS设置面板 8.2.3 Warnings设置面板 8.2.4 Errors设置面板 8.2.5 Debug/Optionization设置面板 8.2.6 Preprocessor设置面板 8.2.7 Code Generation设置面板 8.2.8 Extras设置面板 8.2.9 其他命令行可选项 8.3 编译器应用 第9章 ADS中其他选项设置 9.1 windows窗口操作命令 9.2 关于IDE的通用选项设置 9.2.1 Build Settings设置面板 9.2.2 IDE Extras设置面板 9.2.3 Plugin Settings设置面板 9.2.4 Shielded Folders设置面板 9.2.5 Source Trees源路径设置面板 9.3 关于生成目标的通用选项设置 9.3.1 Targget Settings设置面板 9.3.2 Build Extras设置面板 9.3.3 ARM Target设置面板 9.4 调试器选项设置 9.4.1 ARM Debugger设置面板 9.4.2 ARM Runner设置面板 9.4.3 ARM Features设置面板 9.5 操作命令设置和工具栏设置 9.5.1 设置菜单中的操作命令 9.5.2设置工具栏 9.6 关于VCS 第10章 ARM链接器 10.1 链接的一般概念 10.1.1 链接器的输入和输出 10.1.2 映像文件的加载和执行 10.1.3 输入段在映像文件中的排列顺序 10.2 链接器的使用方法 10.2.1 在命令行方式中使用链接器 10.2.2 在图形方式中使用链接器 10.3 ARM链接器选项设置 10.3.1 ARM链接器中的选项 10.3.2 Output设置面板 10.3.3 Option设置面板 10.3.4 Layout设置面板 10.3.5 Listings设置面板 10.3.6 Extras设置面板 10.3.7 在图形方式中没有使用的选项 10.4 链接器应用 10.5 地址映射过程和seatter描述文件 10.5.1 链接器的地址映射过程 10.5.2 seatter描述文件的结构 10.5.3 seatter描述文件的规则 10.5.4 seatter描述文件的应用 第11章 ADS中几个有特色的功能 11.1 在图形方式中使用命令行 11.1.1 via格式文件 11.1.2 ADS图形方式中的命令行表达窗 11.1.3 生成选项设置参数的导入和导出 11.2 symdefs格式文件 11.2.1 symdefs格式文件的内容 11.2.2 symdefs格式文件的作用 11.2.3 建立symdefs格式文件 11.3 代码转换工具fromELF 11.3.1 代码转换工具fromELF简介 11.3.2 fromELF命令行选项 11.3.3 fromELF工具在图形方式中的选项设置 11.3.4 fromELF实用工具应用 11.4 隐藏和重命名全局符号文件steering 第12章 ARM调试工具AXD介绍 12.1 ARM调试工具AXD介绍 12.1.1 几个基本概念 12.1.2 ARM调试工具AXD介绍 12.2 调试器的使用方法 12.2.1 armsd使用方法 12.2.2 A。XD使用方法 12.3 使用AXD调试用户程序 12.3.1 基本知识 12.3.2 控制程序运行的工具图标 12.3.3 控制程序运行的操作命令 12.3.4 在程序窗口中的级联菜单 12.4 关于调试器设置 12.4.1 调试目标的界面配置 12.4.2设置调试目标 12.4.3 配置处理器 12.5 AXD 00If的菜单选项 12.5.1 文件操作命令 12.5.2 搜索命令 12.5.3 与处理器相关的视窗 12.5.4 与目标系统相关的视窗 12.5.5 窗口管理命令 12.6 AXD II的数据格式 12.6.1 设置当前数据格式 12.6.2 设置默认的数据格式 12.7 主窗口中的工具图标 第13章 调试工具AXD应用 13.1 寄存器 13.1.1 寄存器的使用方法 13.1.2 寄存器视窗中的级联菜单i 13.2 存储器 13.2.1 存储器的使用方法 13.2.2 存储器视窗中的级联菜单 13.2.3 调试用户程序应用举例 13.3 在调试中使用断点 13.3.1 断点使用方法 13.3.2 断点管理级联菜单 13.4 观测项和观测点 13.4.1 使用观测项(Watch) 13.4.2 使用观测点(Watchpoint) 13.5 其他调试方法 13.5.1 调试时观察程序变量 13.5.2 在调试程序时使用符号表 13.6 Profiling功能 附录A 按菜单索引 A.1 按CodeWarriror IDE 中的菜单索引 A.2 按AXD 中的菜单索引 附录B 术语解释 参考文献
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值