#pragma arm section zidata = “non_initialized” /* uninitialized data in non_initialized section * (without the pragma, would be in .bss section by default) / inti,j; #pragma arm section zidata / back to default (.bss section) / intk=0,l=0;/ zero-initialized data in .bss section */
#include<stdio.h> // attribute((const)) functions do not read or modify any global memory intmy_double(intb)attribute((const)); intmy_double(intb){ returnb*2; }
intmain(void){ inti; intresult; for(i=0;i<10;i++) { result=my_double(i); printf(" i = %d ; result = %d \n",i,result); } }
int my_destructor(void) attribute((destructor));
int my_destructor(void) / This function is called after main() /
{ / completes or after exit() is called. */
…
return 0;
}
attribute((weak)) 表明函数是弱链接的,如果有比它强的连接,则调用其他函数
intfunc(void)attribute((weak));
intfunc(void)attribute((weak)) { // do something }
intfunc(void);
intfunc(void) { // do something }
intmain(void) { //do something func(); // do something return0; }
有些CPU的控制 C无法直接办到,需要使用内联汇编,但是以上这些内置指令直接实现为汇编,可以直接使用这些指令控制 CPU 的行为,例如 __wfe, __wfi可以控制 CPU 的休眠特性。
4. 常用编译器支持语言拓展
4.1. C89/90 下可以使用的 C99标准
在 C89/90 语言标准下可以使用 // 注释
可变参数宏
#define debug(format, …) fprintf (stderr, format, VA_ARGS) voidvariadic_macros(void) { debug(“a test string is printed out along with %x %x %x\n”,12,14,20); }
long long 与 unsigned long long, 和 C89/90 使用的 __int64 功能相同
externcharSTACK
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
"
>
B
a
s
e
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
p
"
>
;
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
k
"
>
e
x
t
e
r
n
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
k
t
"
>
c
h
a
r
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
"
>
S
T
A
C
K
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
e
r
r
"
>
</span><span class="n">Base</span><span class="p">;</span> <span class="k">extern</span> <span class="kt">char</span> <span class="n">STACK</span><span class="err">
</span><spanclass="n">Base</span><spanclass="p">;</span><spanclass="k">extern</span><spanclass="kt">char</span><spanclass="n">STACK</span><spanclass="err">Length; #define STACK_BASE &STACKKaTeX parse error: Expected 'EOF', got '#' at position 30: …pan class="cp">#̲define STACK_TO…Length))
5.2. 使用
S
u
p
e
r
Super
Super$ 和
S
u
b
Sub
Sub$ 打补丁
例如替换 foo() 函数:
externvoidExtraFunc(void); externvoid
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
"
>
S
u
p
e
r
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
e
r
r
"
>
</span><span class="n">Super</span><span class="err">
</span><spanclass="n">Super</span><spanclass="err">$foo(void):
/* this function is called instead of the original foo() */ void
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
n
"
>
S
u
b
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
e
r
r
"
>
</span><span class="n">Sub</span><span class="err">
</span><spanclass="n">Sub</span><spanclass="err">KaTeX parse error: Expected '}', got 'EOF' at end of input: …an class="err">SuperKaTeX parse error: Can't use function '$' in math mode at position 233: … * omit the $̲Superfoo(); function call. */ }
S
u
p
p
e
r
Supper
Supper
f
o
o
<
/
e
m
>
指
代
原
来
的
函
数
<
e
m
>
foo</em> 指代原来的函数 <em>
foo</em>指代原来的函数<em>Sub$$foo 用来替换的新函数,则链接器链接此函数取代原来的foo()函数。
以上为对KEIL平台的工具的基本认识,如果需要进一步学习,可以阅读KEIL的官方文档 ARM Product Manuals
往下翻,找到如图位置的5.06 for windows的文件,点击下载,下载时需要登录账号。文件夹下新建一个文件夹,把编译器安装到新建的文件夹里面。先解压下载的压缩文件,在installer文件夹里面有一个。然后点确定,OK之类的。最后选择使用刚才安装的编译器。文件,双击它, 同意协议,在安装位置选择。打开keil,按照图示配置即可。
STM32 C++编程系列2.5:让Keil MDK工程支持现代C++特性及填坑
qq_31562655的博客
11-29
8359
一、问题背景
利用STM32CubeMX建立的Keil工程中,默认是使用AC5(Arm Compiler 5)编译器的,该编译器仅支持C99标准和C++98标准,无法支持现代C++(C++11之后由于添加了大量现代编程语言特性而被称作现代C++),且AC5编译速度的慢也是有目共睹的,因此我们选用更新更强大的AC6(Arm Compiler 6)来给我们的开发(折腾)上一个新的台阶。毕竟C++11之后出现的大量新特性还是很香的,不在STM32这个平台上大显身手就可惜了。
比如强大的auto关键字:
auto
编译器指令重排(Compiler Instruction Reordering)
compiler的主要工作就是将对人们可读的源码转化成机器语言,机器语言就是对CPU可读的代码。因此,compiler可以在背后做些不为人知的事情。我们考虑下面的C语言代码:
int a, b;
void foo(void)
{
a = b + 1;
b = 0;
}
...
I_am_???: 我觉得你写得很棒
CSDN-Ada助手: 非常感谢CSDN博主的精彩分享,这篇博客对于了解AES加密算法的人来说非常有价值。我觉得博主可以考虑写一篇关于RSA加密算法的博客,讲解其原理、应用场景以及实现方式,这样的技术文章对于想要深入了解加密算法的读者会非常有帮助。下一篇你可以继续就RSA加密算法继续写,相信会有更多读者受益。期待更多精彩的技术分享! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。
muyepiao1: 第一次没看懂,第二次有点懂。
知信君: cos90 不是0吗?
liuruoc: 很多图片和代码都看不到了