ARM-LINUX学习记录
程序员文章站
2022-06-03 18:55:28
1:调用C语言函数之前会有一段汇编代码在前面执行来完成软硬件方面的初始化。比如:关闭看门狗;初始化时钟;设置堆栈;调用main函数等。在学习51单片机时候这些操作是由开发环境(如KEIL)在编译C代码的时候,帮我们做好这些工作。但是在开发ARM程序时,由于ARM处理器支持多种模式,多种功能,在不同的 ......
1:调用c语言函数之前会有一段汇编代码在前面执行来完成软硬件方面的初始化。比如:关闭看门狗;初始化时钟;设置堆栈;调用main函数等。在学习51单片机时候这些操作是由开发环境(如keil)在编译c代码的时候,帮我们做好这些工作。但是在开发arm程序时,由于arm处理器支持多种模式,多种功能,在不同的项目里面,我们可能会选择不同的功能。这时,编译器就不知道我们需要什么功能,所以它无法帮助我们完成初始化的那些工作,而需要我们来完成这些工作。
eg:简单的启动代码
@****************************************
@ file: startup.s
@ function: start up
@ author: pang123hui
@****************************************
.text
.global _start
_start:
ldr r0,=0x7e004000 @ watchdog寄存器地址
mov r1,#0x0
str r1,[r0] @ 写入0,禁止watchdog,否则cpu会不断重启
ldr sp,=0x0c001000 @ 设置堆栈,注意:这时我们是将程序直接烧录到sdram中,所以堆栈要设置在sdram中
@ 如果将程序烧在nand flash中,需将堆栈改为1024*4,因为nand flash中的代码
@ 在复位后会移到内部ram中,此ram只有4k
bl main @ 调用c程序中的main函数
halt_loop:
b halt_loop
2:ioremap映射函数
eg:void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
入口: phys_addr:要映射的起始的io地址,即:物理地址
size:要映射的空间的大小;
flags:要映射的io空间的和权限有关的标志;
因为linux的驱动程序是基于操作系统之上的,它无法直接操作硬件。所以我们通过ioremap函数将硬件上的寄存器,映射为虚拟的内存,从而使驱动程序操作硬件上的寄存器。(linux系统一切皆文件的思想)。
时间:2019/07/16
下一篇: 面膜真薄
推荐阅读