C++ #pragma指令详解:改变MCU与中断函数配置

1星 需积分: 45 13 下载量 119 浏览量 更新于2024-09-11 收藏 21KB DOC 举报
"#pragma用法_汇总.doc 是一篇关于C语言#pragma指令的文档,主要讨论了#pragma LINK INFO DERIVATIVE "mc9s12xs128" 和 #pragma CODE SEG NEAR SEG NON BANKED 的用途和含义。文档中提到了这两个pragma用于飞思卡尔的16位单片机开发,帮助理解如何自动调整MCU类型和编写中断函数的注意事项。" #pragma指令是C编译器提供的一种元编程工具,用于向编译器提供额外的信息或指示,以控制编译过程。以下是对这两个特定pragma指令的详细解释: 1. **#pragma LINK INFO DERIVATIVE "mc9s12xs128"** 这个pragma指令用于指定目标微控制器(MCU)的型号,例如在这里是"mc9s12xs128"。在开发过程中,如果你需要更换MCU型号,通常需要手动更新相关的配置文件。但是,通过使用这个pragma,编译器可以自动识别并适应新的MCU,避免了手动修改的麻烦。在创建新工程并改变MCU型号后,编译器会自动更新相应的配置以适应新MCU的特性。 2. **#pragma CODE SEG NEAR SEG NON BANKED** 这个pragma指令用于控制代码段的存储位置。在某些单片机系统中,特别是像飞思卡尔的16位单片机,内存可能被划分为多个银行(banked),不同的代码段可能需要存放在不同的内存区域。"NEAR"表示近存储区,通常用于访问速度较快但容量较小的内存;"SEG NON BANKED"指示代码应放置在非分页内存中,这样可以确保中断服务程序不受当前内存银行切换的影响。在中断服务函数中使用此pragma,可以确保中断处理代码能在正确的位置执行,避免因内存银行切换导致的错误。 除此之外,文档中还提到了其他一些#pragma指令的用法,虽然未详细展开,但它们同样在C编程中扮演着重要角色: 3. **#pragma message** 这个pragma用来在编译输出中插入自定义的文本信息,便于调试或记录编译过程中的特定事件。 4. **#pragma code_seg** 它用于指定函数或代码块应该被放入内存的哪个部分。这对于管理内存资源和优化代码布局很有用,特别是在嵌入式系统中。 5. **#pragma once** 这个pragma确保头文件只在编译期间被包含一次,防止重复包含导致的编译错误。 6. **#pragma hdrstop** 告诉编译器停止预处理当前头文件,防止其他包含的头文件也被处理。 7. **#pragma resource** 这个指令通常用于将资源文件(如Windows下的*.dfm文件)包含到工程中,以便在编译时处理这些资源。 了解并恰当使用#pragma指令可以极大地提高代码的可移植性、可维护性和性能,特别是在处理特定平台的嵌入式系统时。在实际开发中,根据项目需求和编译器的特性,选择合适的pragma指令是非常重要的。

Shader "FancyScrollViewGallery/Metaball" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) _StencilComp ("Stencil Comparison", Float) = 8 _Stencil ("Stencil ID", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 } CGINCLUDE #include "UnityCG.cginc" #include "UnityUI.cginc" #include "../Common/Common.cginc" #include "Metaball.hlsl" #pragma multi_compile __ UNITY_UI_CLIP_RECT #pragma multi_compile __ UNITY_UI_ALPHACLIP struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 uiCoord : TEXCOORD0; float4 worldPosition : TEXCOORD1; UNITY_VERTEX_OUTPUT_STEREO }; sampler2D _MainTex; fixed4 _Color; fixed4 _TextureSampleAdd; float4 _ClipRect; float4 _MainTex_ST; v2f vert(appdata_t v) { v2f OUT; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); OUT.worldPosition = v.vertex; OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); OUT.uiCoord = ui_coord(TRANSFORM_TEX(v.texcoord, _MainTex)); OUT.color = v.color * _Color; return OUT; } fixed4 frag(v2f i) : SV_Target { half4 color = metaball(i.uiCoord); color += _TextureSampleAdd; color *= i.color; #ifdef UNITY_UI_CLIP_RECT color.a *= UnityGet2DClipping(i.worldPosition.xy, _ClipRect); #endif #ifdef UNITY_UI_ALPHACLIP clip(color.a - 0.001); #endif return color; } ENDCG SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } Cull Off Lighting Off ZWrite Off ZTest [unity_GUIZTestMode] Blend SrcAlpha OneMinusSrcAlpha ColorMask [_ColorMask] Pass { Name "Default" CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 ENDCG } } }

2023-06-07 上传