weiqi7777

基于S3C6410的ARM11学习(十四) 终于到main了

0
阅读(2196)

  基本上qboot的第一阶段的汇编开发已经结束了,c的环境已经设置好了,下面就要进行c语言的程序开发了。学过c语言的都知道,程序运行的第一个函数就是main函数。不过在嵌入式中,这个第一个函数可就不一定就是main函数了,也可以是其他函数了。在我的设计中,这c语言的入口函数就是qmain函数。

    在这个qmain函数中,实现一个流水灯。

    直接在汇编部分实现了怎么让灯闪烁,只要对对应的寄存器进行配置就好了。怎么用c语言来对寄存器进行配置了,这个时候就要使用c语言中强大的指针了。例如,要对地址0x5000_0000进行写操作。

    只要定义一个指针:

        unsigned long  *p = (volatile unsigned long )0x5000_0000

    这样对指针p的操作,就是对地址0x5000_0000的操作了。后面是一个强制转换,将地址转换为unsigned long型(32位),要注意要加volatile,通知仿真编译器对这个指针进行优化。

    有了这个基础,那qmain的代码就很简单了。

  clip_image002

    首先定义与GPIO相关的两个寄存器指针,通过指针对这两个寄存器进行赋值。就实现了控制led了。

    这里的main函数名叫qboot_main。接下来,就要在之前写的qboot汇编代码中去调用这个qboot_main

    clip_image003

    直接使用ldr指令,将qboot_main的值给pc,就程序跳转了,这个时候跳转是绝对跳转。qboot_main的值就是qboot_main函数的地址。而这个地址这个时候是在内存空间地址范围的,通过绝对跳转,程序就到ddr中去运行了。

    汇编调用c函数的话,直接将c函数的名字标号赋值给pc即可了。

 


    这样,就到了main的世界了,下面的开发就和STM32的开发差不多了。无非就是操作的寄存器不一样,外设不一样。

 


对于STM32

    main函数是固定的,你不能写成其他函数,因为这个是官方固定的,在启动代码的reset,会调用_main函数,这个函数是官方实现的,在这个函数的最后,就会跳转到main函数去,所以在STM32中,第一个函数就是main函数。