【GreenHills】:汇编语法

这篇具有很好参考价值的文章主要介绍了【GreenHills】:汇编语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


汇编是编译器必经之路,任何C/C++最终都是转换成汇编,进而执行编译。
这里我们讨论如果编译器是GreenHills时,他的编译过程及相关宏。


GreenHills的汇编宏定义

文件:Davinci\Gen\Appl\Include\BrsHw.h

/**********************************************************************************************************************
 * Compiler abstraction
 *********************************************************************************************************************/
#if defined (BRS_COMP_GHS)
  #define ___asm(c)               __asm_(c)
  #define __asm_(c)               asm(" " #c);
  #define __as1(c, d)             __as1_(c, d)
  #define __as1_(c, d)            asm(" " #c " , " #d);
  #define __as2(c, d, e)          __as2_(c, d, e)
  #define __as2_(c, d, e)         asm(" " #c " , " #d " , " #e);
  #define BRS_ISR_BASE_ENTRY(x)   ___asm(jr x)
  #define BRS_ISR_ALIGNMENT       ___asm(nop)___asm(nop)___asm(nop)___asm(nop)___asm(nop)___asm(nop)
  #define BRS_ALIGN16()           asm(" .align 16");
  #define BRS_ISR_ENTRY(x)        ___asm(.word x)
  #define BRS_ISR_KEYWORD         __interrupt
  #define BRS_ISR_DEFINE(x)       _##x

  #define BRS_SECTION_CODE(c)     asm(" .section ." #c "," "ax" );
  #define BRS_GLOBAL(c)           asm(" .globl " #c);
  #define BRS_LABEL(c)            asm(#c ":");

  /* Unconditional branch to c */
  #define BRS_BRANCH(c)           ___asm(jr32 c) 

  /* Branch to e if c and d are equal */
  #define BRS_BRANCH_EQUAL(c,d,e) __as1(cmp   c, d) \
                                  ___asm(be   e)

  /* Branch to e if c and d are NOT equal */
  #define BRS_BRANCH_NOT_EQUAL(c,d,e)  __as1(cmp   c, d) \
                                       ___asm(bne   e)

/* Reads core id value (PEID) from HTCFG0 to register c. */
/* Register d is only a working register and can be reused afterwards */
# if defined (BRS_CPU_CORE_G4MH)
  #define BRS_READ_COREID(c)  __as2(stsr  0, c, 2)
# else
  #define BRS_READ_COREID(c)  __as2(stsr  0, c, 2) \
                              __as1(shr   17, c)
# endif

/* Reads architecture identifier value from PID to register c. */
/* Register d is only a working register and can be reused afterwards */
  #define BRS_READ_CORETYPE(c,d)  __as2(stsr  6, c, 1) \
                                  __as1(shr   24, c)   \
                                  __as1(mov   0xff, d) \
                                  __as1(and   d, c)

#else
  #error "Compiler not yet supported"
#endif

入口函数brsStartupEntry定义

文件:Davinci\Gen\Appl\Source\BrsHwStartup.c

/**********************************************************************************************************************
 *  INCLUDES
 *********************************************************************************************************************/
#include "BrsHw.h"
#include "BrsMain.h"
#include "vLinkGen_Lcfg.h"
/* =========================================================================== */
/*                                                                             */
/* Description: Entry point for all cores                                      */
/*                                                                             */
/* =========================================================================== */
BRS_SECTION_CODE(brsStartup)
 BRS_GLOBAL(brsStartupEntry)
BRS_LABEL(brsStartupEntry)
/*
//上面3句它等效于
.section .brsStartup ,ax
.globl brsStartupEntry
brsStartupEntry :
//含义就是,定义一个函数brsStartupEntry()存放在brsStartup字段里
....
....
/* =========================================================================== */
/* Minimal reset vector at entry address (e. g. 0x0)                           */
/* =========================================================================== */
__as1(.section ".bcode0", "ax")
BRS_ALIGN16()
BRS_BRANCH(brsStartupEntry)
___asm(nop)
___asm(nop)
___asm(nop)
BRS_ALIGN16()
 BRS_BRANCH(_BrsMainExceptionStartup)
___asm(nop)
___asm(nop)
___asm(nop)
#if (BRS_CPU_CORE_AMOUNT>1)
/* =========================================================================== */
/* Minimal reset vector at entry address (e. g. 0x0)                           */
/* =========================================================================== */
__as1(.section ".bcode1", "ax")
BRS_ALIGN16()
BRS_BRANCH(brsStartupEntry)
___asm(nop)
___asm(nop)
___asm(nop)
BRS_ALIGN16()
 BRS_BRANCH(_BrsMainExceptionStartup)
___asm(nop)
___asm(nop)
___asm(nop)
#endif /*BRS_CPU_CORE_AMOUNT>1*/
/*
上面这段汇编代码意思就是,在bcode0、bcode1字段最开始地方防止一条无条件跳转指令,跳转至brsStartupEntry
*/
*/

文件:Davinci\Gen\Appl\Source\vLinkGen_Template.ld
此文件通过Davinci vLinkGen模块自动生成,也可以自己修改。

MEMORY
{
  CODE_FLASH_CORE0_FBL : ORIGIN = 0x00000000 , LENGTH = 0x00020000 /* 128 KiB */
  BCODE0 : ORIGIN = 0x00020000 , LENGTH = 0x00000080 /* 128 Byte */
  CODE_FLASH_VERSION_CORE0 : ORIGIN = 0x00020080 , LENGTH = 0x00000080 /* 128 Byte */
  CODE_FLASH_CORE0 : ORIGIN = 0x00020100 , LENGTH = 0x0025FF00 /* 2 MiB */
  BCODE1 : ORIGIN = 0x00280000 , LENGTH = 0x00000080 /* 128 Byte */
  CODE_FLASH_CORE1 : ORIGIN = 0x00280080 , LENGTH = 0x0011FF00 /* 1 MiB */
  CODE_FLASH_A_AES128 : ORIGIN = 0x0039FF80 , LENGTH = 0x00000080 /* 128 Byte */
  CODE_FLASH_A_HSM : ORIGIN = 0x003A0000 , LENGTH = 0x00060000 /* 384 KiB */
  LOCAL_RAM_CPU1_0 : ORIGIN = 0xFDA00000 , LENGTH = 0x00010000 /* 64 KiB */
  LOCAL_RAM_CPU0_0 : ORIGIN = 0xFDC00000 , LENGTH = 0x00010000 /* 64 KiB */
  vHsmIpcMemory : ORIGIN = 0xFE000000 , LENGTH = 0x00000500 /* 1 KiB */
  vGlobalRamBuffer : ORIGIN = 0xFE000500 , LENGTH = 0x00003B00 /* 15 KiB */
  CLUSTER_RAM_0_0 : ORIGIN = 0xFE004000 , LENGTH = 0x0004BB80 /* 303 KiB */
  STACK_C0 : ORIGIN = 0xFE04FB80 , LENGTH = 0x00000400 /* 1024 Byte */
  cRAM_CoreSync : ORIGIN = 0xFE04FF80 , LENGTH = 0x00000080 /* 128 Byte */
  CLUSTER_RAM_0_TRUST : ORIGIN = 0xFE050000 , LENGTH = 0x00030000 /* 192 KiB */
  CLUSTER_RAM_2_0 : ORIGIN = 0xFE400000 , LENGTH = 0x000FFC00 /* 1023 KiB */
  STACK_C1 : ORIGIN = 0xFE4FFC00 , LENGTH = 0x00000400 /* 1024 Byte */
  MCU_DATA_FLASH : ORIGIN = 0xFF200000 , LENGTH = 0x00050000 /* 320 KiB */
  APPOB    : ORIGIN = 0xFF321380,     LENGTH = 0x80			 /* APP option bytes*/
  HSMOB    : ORIGIN = 0XFF322700,     LENGTH = 0x14			 /* HSM option bytes*/
}
SECTIONS
{
  .Startup_Code_Core0 ALIGN(4) :
  {
    *(.bcode0)
  } > BCODE0
    .Startup_Code_Core1 ALIGN(4) :
  {
    *(.bcode1)
  } > BCODE1
  .Brs_Startup_Code ALIGN(4) :
  {
    *(.brsStartup)
  } > CODE_FLASH_CORE0

  .APPOB_SECTION       align(4)             :>APPOB
  .HSMOB_SECTION       align(4)             :>HSMOB

}

通过以上Davinci\Gen\Appl\Source\BrsHwStartup.c和Davinci\Gen\Appl\Source\vLinkGen_Template.ld我们就能知道:


1、字段bcode0放在了物理Flash0x00020000
2、字段bcode0最开始位置为一条无条件跳转指令,跳转至brsStartupEntry
3、函数brsStartupEntry放在了字段brsStartup,该字段放在了物理Flash0x00020100


注意:
1、.ld文件中,同字段,位置靠前,则相关函数存放在物理Flash上也靠前


多核的入口地址定义

多核MCU,拿RH850 U2Ax来说,每个核的具体入口地址,则是在OptionByte中被指定:
【GreenHills】:汇编语法


结合上面的描述,我们就可以设置:
Reset Vector (PE0) = 0x00020000;也就代表核0启动时直接从此地址取指令执行。
Reset Vector (PE1) = 0x00280000;也就代表核0启动时直接从此地址取指令执行。


文件:Davinci\Gen\Appl\Source\OptionBytes.c

// referring to Table 51.50 configuration setting area for details
#define  PE0_STARTUP_ADDR			(0x20000)//size = 2432k
#define  PE1_STARTUP_ADDR			(0x280000)//size = 1152K-128

#define  OP12_DOUBLE_MAP_MODE		(0xFFFFFFFC)
#define  OP12_SINGLE_MAP_MODE   	(0xFFFFFFFD)

#define  OP3_STARTUP_USERBOOT_AREA  (0xFDFFF2FD)
#define  OP3_STARTUP_USER_AREA 		(0xFDFFF2FC)

#pragma ghs section rodata = ".APPOB_SECTION"
volatile const uint32 OptionBytes[32] = 
{
	PE0_STARTUP_ADDR			,// Reset Vector (PE0)         Shipping : 0x00000000
	PE1_STARTUP_ADDR			,// Reset Vector (PE1)         Shipping : 0x00000000 [Modified]	
	0xFFFFFFFF			,// Reset Vector (PE2)         Shipping : 0x00800000	
	0xFFFFFFFF			,// Reset Vector (PE3)         Shipping : 0x00800000	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0x3FF20010			,// Option byte  0 (OPBT0)     Shipping : 0x3FF30010	
	0xF0FB0000			,// Option byte  1 (OPBT1)     Shipping : 0xF0FB0000	
	0xFFFFFFFF			,// Option byte  2 (OPBT2)     Shipping : 0xFFFFFFFF	
	OP3_STARTUP_USER_AREA 			,// Option byte  3 (OPBT3)     Shipping : 0xF1FFFEFE[Modified]	
	0x0C0C0C0F			,// Option byte  4 (OPBT4)     Shipping : 0x0C0C0C0F	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0xFFFF0FC3			,// Option byte  6 (OPBT6)     Shipping : 0xFFFF0FC3	
	0xFFFFFFFF			,// Option byte  7 (OPBT7)     Shipping : 0xFFFFFFFF	
	0xFFFFFFFE			,// Option byte  8 (OPBT8)     Shipping : 0xFFFFFFFE	
	0xFFF1FFFF			,// Option byte  9 (OPBT9)     Shipping : 0xFFF1FFFF	
	0XF9FD288E			,// Option byte 10 (OPBT10)    Shipping : 0xFBFD288E [Modified]	main osc(A0) is 24 MHZ(0XFAFD288E), main osc(A1) is 20 MHZ(0XF9FD288E)
	0xEFFFFFFF			,// Option byte 11 (OPBT11)    Shipping : 0xFFFFFFFF [Modified]	
	OP12_DOUBLE_MAP_MODE			,// Option byte 12 (OPBT12)    Shipping : 0xFFFFFFFD [Modified]	
	0xFFFFFFFF			,// Option byte 13 (OPBT13)    Shipping : 0xFFFFFFFF	
	0x00000192			,// Option byte 14 (OPBT14)    Shipping : 0x00000192	
	0xFFFFFFFF			,// Reserved                   Shipping : 0xFFFFFFFF	
	0x6FFFFFFF			,// Option byte 16 (OPBT16)    Shipping : 0x6FFFFFFF	
	0xFFFFFFFF			,// Option byte 17 (OPBT17)    Shipping : 0xFFFFFFFF	
	0xFFFFFFFF			,// Option byte 18 (OPBT18)    Shipping : 0xFFFFFFFF	
	0xFFFFFFFF			,// Option byte 19 (OPBT19)    Shipping : 0xFFFFFFFF	
	0xF088FF00			,// Option byte 20 (OPBT20)    Shipping : 0xF088FF00	
	0x000000CC			,// Option byte 21 (OPBT21)    Shipping : 0x000000CC	
	0xC000C000			,// Option byte 22 (OPBT22)    Shipping : 0xC000C000	
	0xFFFFC000			// Option byte 23 (OPBT23)    Shipping : 0xFFFFC000	
};
#pragma ghs section rodata = default

定义OptionBytes数据,存放在字段APPOB_SECTION(物理地址:0xFF321380),通过FlashProgram烧录至MCU。
文件:xxx.hex
【GreenHills】:汇编语法
【GreenHills】:汇编语法
【GreenHills】:汇编语法文章来源地址https://www.toymoban.com/news/detail-490670.html

到了这里,关于【GreenHills】:汇编语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 选择云原生是企业进行技术变革的必经之路

    众所周知,云计算领域的蓬勃发展,让越来越多的企业将自己的业务搬到云上,上云已经成为大部分企业的首选操作。无论是头部的中大型企业,还是普通的微小企业,企业业务是亘古不变的核心,这关系着企业的命脉,所以不管上不上云,企业关系的业务数据。那么话又说

    2024年02月05日
    浏览(34)
  • 空投:实现去中心化、建立DAO的必经之路

    当一个去中心化应用推出原生代币,那它首先得考虑如何给用户空投。 为什么要空投代币给用户? 因为它需要去中心化(至少官方是这样说的)。 空投可定义为“为用户分发代币的行为”。 1.空投的意义 起初的空投大多为了营销与扩大知名度。   Uniswap 对 18w 用户空投总价

    2023年04月14日
    浏览(31)
  • Node.js | 从前端到全栈的必经之路

    🧑‍💼 个人简介:即将大三的学生,一个不甘平庸的平凡人🍬 🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路:前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 👉 你的一键三连是我

    2024年02月03日
    浏览(47)
  • Vue.js 3 项目开发:迈向现代化前端开发的必经之路

    随着前端技术的不断发展,Vue.js作为一种轻量级的JavaScript框架,已经逐渐成为了前端开发者的首选。Vue.js 3有哪些新特性、优势以及如何高效地进行项目开发呢? Vue.js是一种用于构建用户界面的渐进式框架。它的核心库专注于视图层,易于与其他库或现有项目集成。Vue.js 3是

    2024年01月23日
    浏览(40)
  • 从功能测试转型测试开发,薪资涨了20K,1000字讲述转型必经之路...

    身处职场之中,犹如逆水行舟不进则退,想要不被后浪拍死在沙滩上,就要不断学习新知识,接受新事物。 要得到更好的发展,就要紧跟发展趋势,不断转型才能保持竞争力,在职场中占有一席之地。 转型不是一件容易的事,涉及到转型、革新,就要突破现有的框架,必然

    2024年02月06日
    浏览(36)
  • C++输出编译器名称和版本以及编译器位数、C/C++常见编译器

    常见的C/C++编译器主要包括以下几种: GCC (GNU Compiler Collection):GCC是一个广泛使用的编译器套件,支持多种编程语言,包括C、C++、Objective-C等。它具有强大的优化能力和跨平台支持,并且被广泛应用于各种操作系统和开发环境。 Clang :Clang是基于LLVM的编译器前端,支持C、

    2024年02月13日
    浏览(35)
  • python在线编译器搭建,python在线编译器源码

    本篇文章给大家谈谈python在线编译器搭建,以及python在线编译器源码,希望对各位有所帮助,不要忘了收藏本站喔。 1. PyCharm集成开发环境 2. PyCharm的下载与安装 3. Pycharm的使用 3.1 创建Python项目 3.2 创建子目录 3.3 创建Python文件 3.4 切换解释器 3.5 常用快捷键 4. Pycharm常用配置

    2024年03月25日
    浏览(46)
  • 编译器(Compiler)及C/C++编译器安装(c+安装)

    目录 一、常用编程语言的编译器(compiler) 概述 二、GCC、MinGW、MinGW-w64 、TDM-GCC、Cygwin、MSYS、MSYS2的区别 三、MinGW-w64编译器套件下载及安装 四、MinGW-w64安装后,windows环境变量配置(设置) 五、编译器的运行及其与开发环境的关系、编译器的来源        机器语言是一种计算机指

    2024年02月07日
    浏览(52)
  • 探索Kotlin K2编译器和Java编译器的功能和能力

    文章首发地址 Kotlin K2编译器是Kotlin语言的编译器,负责将Kotlin源代码转换为Java字节码或者其他目标平台的代码。K2编译器是Kotlin语言的核心组件之一,它的主要功能是将Kotlin代码编译为可在JVM上运行的字节码。 编译过程: Kotlin K2编译器将Kotlin源代码作为输入,并经过词法分

    2024年02月11日
    浏览(35)
  • 【C语言】--编译及编译器

    夫学须静也,才须学也;非学无以广才,非志无以成学 个人主页:【😊个人主页】 系列专栏:【❤️系列专栏】 C语言一直以来都是初入编程的小白们的必修课,作为程序员必学语言之一,C语言自然有属于它的奥秘,接下来就由我来带领大家走进C语言的世界吧🚗🚗🚗 1、

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包