查看: 6208|回复: 13

[原创] K64开发板体验之IAR启动代码分析

[复制链接]
  • TA的每日心情
    慵懒
    2016-12-22 14:33
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    34

    主题

    512

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1378
    最后登录
    1970-1-1
    发表于 2015-1-31 11:08:51 | 显示全部楼层 |阅读模式
    昨天收到了社区的K64的板子,很是兴奋,板子比想象中的小很多,板上只有一个LED灯可以供我玩,其他都是留的接口。之前用过cortexM3,昨晚下了下这快芯片跟cortexM3基本一样,网上下载了一个启动代码,看了下启动代码。由于我只熟悉IAR,所以这里只分析了IAR启动代码。
    首先看一下源文件中提供的.icf文件。*.icf文件是IAR中的分散描述文件,相当于ADS中的*.src文件或keil中的*.sct文件或GNU中的*.lds链接脚本文件。
    这个文件中前面部分是各个变量的定义,关键看后面部分:

    ***********

    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

    place at address mem:__code_start__ { readonly section .noinit };

    place in RAM_region { readonly, block CodeRelocate };

    place in RAM_region { readwrite, block CodeRelocateRam,

    block CSTACK, block HEAP };

    ************

    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }

    这段代码表示要把.intvec代码段中的只读部分放在存储空间(mem,前面已定义的名称)中__ICFEDIT_intvec_start__ 地址上,前面部分已经定义__ICFEDIT_intvec_start__=0x1fff0000,是SRAM的起始地址。也就是先把向量表放到内存中的最前面。 .intvec 这个段是在vectors.c文件中出现的


    typedef void (*vector_entry)(void);

    #pragma location = ".intvec"

    const vector_entry __vector_table[] = //@ ".intvec" =

    {

    VECTOR_000,

    VECTOR_001,

    VECTOR_002,

    VECTOR_003,

    ......(中间省略)

    }
    从源文件中可以看到这里定义了一个向量表__vector_table(前面的const 很重要不能省,这样才能保证向量表是只读的),向量表中的每一项都是一个指向函数的指针,这里总共有256+4=260个指针,所以占据空间为260*4=1040=0x410.

    place at address mem:__code_start__ { readonly section .noinit }

    这段代码表示要把 .noinit段中的只读部分放到地址空间 __code_start__ 开始的地址上,前面有定义 __code_start__= 0x1fff0410 ,也就是把 .noinit段放到0x1fff0410开始的地址上。所以在内存中代码就连续了,先是向量表,接着的是.noinitd 段。

    .noinit 段在crt0.s汇编文件中出现:

    SECTION .noinit : CODE


    这段代码算是芯片复位后执行的第一段代码(如果没有其他异常的话)。作为一个通常的规则,推荐先把通用寄存器(R0-R12)清零。然后是使能中断,跳转到start标号(或函数)处继续执行。

    start函数中,首先执行 wdog_disable()函数来禁用看门狗,然后调用 common_startup()函数初始化RAM(复制向量表、清零.bss段等,为C语言运行环境做准备),接着执行sysinit()函数初始化芯片(时钟、用到的外设等)。

    common_startup

    初始化RAM(复制向量表、清零.bss段等,为C语言运行环境做准备)。

    1

    2 #include "common.h"

    3 #pragma section = ".data"

    4 #pragma section = ".data_init"

    5 #pragma section = ".bss"

    6 #pragma section = "CodeRelocate"

    7 #pragma section = "CodeRelocateRam"


    在IAR中, #pragma section="NAME" [align] 用来在C语言中指定一个名称是NAME的段,align指定对齐方式。指定的段可以被段操作符来引用,段操作符包括 __section_begin, __section_end, 和 __section_size.
    在存储器最前面放置好向量表-->把通用寄存器清零-->开中断-->跳转到start函数继续执行初始化。在start函数中,顺次执行三个函数:禁用看门狗-->初始化C语言环境(向量表重定向、拷贝数据段到RAM、清零bss段等)-->系统外设初始化。

    然后进入了main函数。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13124
    最后登录
    2019-1-27
    发表于 2015-2-4 09:19:27 | 显示全部楼层
    好的开始 ~ 期待后续 ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-22 09:09
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    446

    帖子

    0

    高级会员

    Rank: 4

    积分
    876
    最后登录
    2019-3-8
    发表于 2015-5-29 15:29:08 | 显示全部楼层
    比较详细,学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16700
    最后登录
    1970-1-1
    发表于 2015-5-29 21:49:51 | 显示全部楼层
    学习了,多谢楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 11:44
  • 签到天数: 872 天

    连续签到: 4 天

    [LV.10]以坛为家III

    3

    主题

    1532

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4795
    最后登录
    2025-7-18
    发表于 2015-6-1 21:27:03 | 显示全部楼层
    看看启动代码,学习了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    30

    主题

    487

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1214
    最后登录
    2020-8-18
    发表于 2015-6-2 00:21:13 | 显示全部楼层
    首先祝贺楼主已经获得板子  点赞  这段启动代码学习了    期待楼主分享更多的学习帖子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-12 10:22
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    386

    帖子

    0

    高级会员

    Rank: 4

    积分
    541
    最后登录
    2018-6-28
    发表于 2015-6-2 08:33:32 | 显示全部楼层
    启动代码分析,这个必须顶。谢谢楼主分享。
    falajf
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-4-27 10:34
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    507

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1450
    最后登录
    2020-8-3
    发表于 2015-6-2 08:55:54 | 显示全部楼层
    很不错的分享!
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    主题

    244

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    339
    最后登录
    1970-1-1
    发表于 2015-6-2 09:33:22 | 显示全部楼层
    分析代码!
    回复

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
    发表于 2015-6-2 15:01:52 | 显示全部楼层
    这个还是非常不错的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 08:03 , Processed in 0.107049 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表