又重新做回了嵌入式,想把以前学到的东西从头复习一下。首先从裸机编程开始。

本系列使用的硬件环境是友善之臂的 mini2440,百问网的OpenJtag,所有程序在 linux gcc下编译, 具体硬件设置  软件环境搭建可见openjtag 文档:

编译器使用友善之臂的 4.4.3 。编译器配置 /etc/profile:

[plain] view plaincopyprint?
  1. PATH="$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin"
  2. export PATH

注意如果在 /etc/provile 里面修改了编译器 之后,只是 source /etc/profile 还是不够的,无法调整所用编译器路径。 正确做法是 先 source /etc/environment  然后再 source /etc/profile

第一个程序是 led 灯控制:

开头 汇编 文件:

[plain] view plaincopyprint?
  1. @******************************************************************************
  2. @ File£ºcrt0.S
  3. @ ¹¦ÄÜ£ºÍ¨¹ýËüתÈëC³ÌÐò
  4. @******************************************************************************
  5. #define  PXT                            0x12
  6. .text
  7. .global _start
  8. _start:
  9. ldr     r0, =0x53000000     @ disable WATCHDOG
  10. mov     r1, #0x0
  11. str   r1, [r0]              @
  12. ldr     sp, =1024*4         @ stack pointer point to 4K
  13. bl      main
  14. halt_loop:
  15. b       halt_loop

主函数文件:

[cpp] view plaincopyprint?
  1. #define GPBCON      (*(volatile unsigned long *)0x56000010)
  2. #define GPBDAT      (*(volatile unsigned long *)0x56000014)
  3. #define GPB5_out    (1<<(5*2))
  4. #define GPB6_out    (1<<(6*2))
  5. #define GPB7_out    (1<<(7*2))
  6. #define GPB8_out    (1<<(8*2))
  7. void  wait(unsigned long dly)
  8. {
  9. for(; dly > 0; dly--);
  10. }
  11. int main(void)
  12. {
  13. unsigned long i = 0;
  14. GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;
  15. while(1){
  16. wait(100000);
  17. GPBDAT = (1<< ( (i%4) + 5) );
  18. if(++i == 16)
  19. i = 0;
  20. }
  21. return 0;
  22. }

这个程序实现的功能是点亮led 灯,并实现流水效果。其中高电平熄灭 led 灯。

链接脚本把两个文件链接成一个独立的二进制文件: ( 使用开始的 4K 字节内存)

[plain] view plaincopyprint?
  1. SECTIONS {
  2. . = 0x00000000;
  3. .text          :   { *(.text) }
  4. .rodata ALIGN(4) : {*(.rodata)}
  5. .data ALIGN(4) : { *(.data) }
  6. .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
  7. }

Makefile 脚本

[plain] view plaincopyprint?
  1. CFLAGS  := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
  2. all : crt0.S  leds.c
  3. arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
  4. arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c
  5. arm-linux-ld -Tleds.lds  crt0.o leds.o -o leds_elf
  6. arm-linux-objcopy -O binary -S leds_elf leds.bin
  7. arm-linux-objdump -D -m arm  leds_elf > leds.dis
  8. clean:
  9. rm -f   leds.dis leds.bin leds_elf *.o

首先运行脚本openocd.sh

[plain] view plaincopyprint?
  1. openocd -f /etc/openocd/interface/openjtag.cfg -f /etc/openocd/target/samsung_s3c2440.cfg

保持开启不退出状态。

然后另开启一个终端启动 elf 文件调试

[plain] view plaincopyprint?
  1. arm-linux-gdb -x gdb.init leds_elf

其中 gdb.init 文件内容:

[plain] view plaincopyprint?
  1. target remote 127.0.0.1:3333
  2. monitor halt
  3. monitor arm920t cp15 2 0
  4. monitor step
  5. load

此时就可以像调试普通程序一样调试这个裸机程序。

工程文件地址:

有一点特别需要注意:

   汇编语言文件开头的位置标号必须是 _start:  如果是其它的则会导致 OpenJtag 无法识别,load 之后 用si指令执行导致 PC指针到未知的位置!!。


mini2440 裸机编程 -led相关推荐

  1. TQ210_裸机编程(一)——点亮LED灯

    TQ210_裸机编程点亮LED灯 首先查看 TQ210 的底板原理图: 我们可以看到 两个 LED 分别接到 S5PV210 的 GPC0_3 和 GPC0_4 引脚. 这里用了 NPN 三极管,具有 ...

  2. BSP板机支持包、linux启动分析、ARM裸机编程

    文章目录 一.BSP 二.驱动 驱动的基本要素 三.启动分析 1.uboot 2.uboot的作用 3.uboot相关命令 关键的内容: 1)bootargs,启动参数 2)启动命令 3)修改启动延时 ...

  3. 07 树莓派裸机编程,并在Windows MSYS2 QEMU模拟器中运行

    作者 将狼才鲸 创建日期 2022-11-14 Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件) CSDN文章地址:项目介绍:开源安防摄像机(嵌入式软件) 4)完整的环境安装步骤 ...

  4. 03 - 程序设计框架:裸机编程中应用层、中间层、驱动层划分

    03-程序设计框架:裸机编程中应用层.中间层.驱动层划分 1.框架设计层次 <代码大全>第五章中,把程序设计分为四个层次: 软件系统,就是整个系统.整个程序 分解为子系统或包.比如我们可以 ...

  5. S5PV210(TQ210)裸机编程

    本文更多的是教会大家如何学习. 4.1    汇编学习 4.1.1 基础知识     4.1.2 ARM模拟器 4.2    S5PV210启动流程 4.3    点亮一个LED 4.4    串口 ...

  6. S5PV210 | 裸机汇编LED流水灯实验

    S5PV210 | 裸机汇编LED流水灯实验 开发板: 1.原理图 上图中,当按下POWER键后,VDD_5V和VDD_IO会产生5V和3.3V的电压,其中D26无须GPIO控制,为常亮状态,即我们所 ...

  7. TQ210裸机编程(3)——按键(查询法)

    首先查看TQ210的底板原理图 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚. 这次编 ...

  8. MINI2440裸机实验之SDRAM

    MINI2440裸机实验之SDRAM 参考文章 <嵌入式应用开发完全指南> S3C2440 SDRAM SDRAM介绍 有关SDRAM的介绍以及S3C2440的SDRAM操作下面的文章介绍 ...

  9. MCU裸机编程的状态机框架--第一部分

    MCU裸机编程的状态机框架--第一部分 1 状态机的概念 1.1 状态机的要素 1.2 状态迁移表 1.3 状态机思路实现一个时钟程序 1.4 状态机应用的注意事项 1.5 更复杂的状态机 2 单片机 ...

最新文章

  1. 网络工程师必须具备的素质
  2. Jenkins cve-2016-0792 漏洞复现 Xstream 反序列化漏洞
  3. WordPress制作插件中使用wp_enqueue_script('jquery')库不起作用解决方法
  4. tp5 if 如果有html判断,tp5条件判断,in,notin,between,if等
  5. SpringBoot_入门-HelloWorld细节-场景启动器(starter)
  6. 如何理解 Linux 中的 load averages
  7. click传值vue_对vue下点击事件传参和不传参的区别详解
  8. 2020年特斯拉是在中国获得补贴最多的电动汽车制造商
  9. 从零开始刷Leetcode——数组(189.217.219)
  10. 随机取 数据库中的 记录
  11. Linux elf文件分析
  12. php仿抖音短视频小程序开发,微信小程序中实现类似抖音短视频切换效果
  13. 教程详解|3D环物的360物体如何在后台上传?
  14. 深度学习——UMRL
  15. 【软件测试】资深测试聊一聊,测试架构师是怎么样的,做一名成功的测试工程师......
  16. java get方法_java get方法
  17. 加州欧文大学计算机申请,加州大学欧文分校信息与计算机科学(信息方向)理学硕士研究生申请要求及申请材料要求清单...
  18. python--表白小程序
  19. 关于雷蛇耳机麦克风突然失灵
  20. 如何停止Monkey测试

热门文章

  1. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )
  2. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
  3. 【计算理论】图灵机 ( 非确定性图灵机 | 非确定性图灵机指令分析 | 计算过程 | 非确定性指令出现多个分支 | 非确定性图灵机转为计算树 | 计算树 )
  4. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
  5. 【Java 网络编程】网络相关概念
  6. 2019-7-29 考试总结
  7. Educational Codeforces Round 66 (Rated for Div. 2)
  8. 如何使用Bootstrap4显示和隐藏元素
  9. 702:Crossing River (贪心)
  10. bzoj1513【POI2006】Tet-Tetris 3D