![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言原理
文章平均质量分 79
明月清风旧
记住你本来的样子
展开
-
STM32 实现类似手机运行APP的方法(篇二:ELF文件解析和APP调用)
一、调用APP遇到的问题在实验中,系统可以直接运行Keil编译出来的bin文件,并且可以正常运行如下代码:include "main_inc.h"const char g_txt[]="g_txt from app\r\n"int my_main(void){ printf("txt from app\r\n"); printf(g_txt); return;}在我重定向printf函数到串口之后,在电脑端的串口助手正常收到了字符串。但是运行如下代码时却不能打印正确的字符串..原创 2020-09-03 19:09:24 · 2366 阅读 · 2 评论 -
STM32 实现类似手机运行APP的方法(篇一:位置无关和系统函数调用)
目录一、原理二、环境三、编译器配置一、原理运行APP的原理是把程序从存储器加载到内存中,然后调用其入口函数运行,这样做是因为一般存储器(如SD卡,硬盘等)CPU无法直接寻址,必须先加载到内存等可以直接寻址的存储器上才能运行。单片机的FLASH也可以直接寻址,所以存储在单片机FLASH中的程序不用加载到内存也可以运行。既然要运行APP,有两个问题需要解决:一、如何告知APP,其需要调用的系统函数的地址;二、加载到内存的区域是动态分配的,这意味着每次加载的内存地址不固定,这需要APP代码的运行与其加载位原创 2020-09-03 16:51:12 · 4117 阅读 · 5 评论 -
STM32 实现类似手机运行APP的方法(篇四:中断服务)
目录一、APP中的中断函数二、系统工程的修改三、APP工程的修改四、实验现象一、APP中的中断函数1、本来以为经过前3篇文章的说明,stm32运行APP的功能已经实现了,但是在今天编写app代码的时候总感觉差点什么,由于需要写一个支持串口收发数据功能的app,发现不能实现接收串口数据,因为app不能定义中断服务函数(中断服务函数全部弱定义在stm32_startup.s文件中),想到安卓手机app开发有一种叫做监听的做法,监听到某事件发生是自动执行一段代码,本文将实现类似功能。二、系统工程的修改新建原创 2020-09-04 22:59:13 · 1270 阅读 · 2 评论 -
STM32 实现类似手机运行APP的方法(篇三:示例程序)
目录一、前提二、编写并编译示例代码三、运行一、前提1、要保证编写的app文件能够正常运行除了前面所提到的设置之外,编译程序的先后顺序也非常重要,系统程序先编译,然后再编译APP程序,如果系统程序因为一些修改而重新编译,则APP程序也必须重新编译,因为生成的syscall.sym文件中的函数地址会随着系统工程的重新编译而更新。2、如果要在APP中调用在系统程序中声明过但未使用的函数,为了防止被编译器优化掉,可以在系统工程中"C/C++"选项卡中去掉 One ELF section par functio原创 2020-09-03 22:37:31 · 3068 阅读 · 0 评论 -
STM32 实现类似手机运行APP的方法(篇五:动态链接)
目录一、简介二、系统程序修改1、添加 sys_api.h 文件2、建立系统API函数表三、APP程序修改1、api_table.s2、sys_api.h3、api调用一、简介动态链接 是一种在运行时链接函数地址的技术,程序运行时在内存中建立函数表,其他程序可以通过这个函数表来调用函数。据我了解,windows、linux使用的动态库就是使用这个方式实现的。由前面几篇文章了解到,单片机环境中app调用系统函数api可以使用 --symdefs=syscall.sym 命令来输出函数符号表,这种方式的缺点原创 2021-03-12 11:55:19 · 3163 阅读 · 8 评论 -
keil环境下实现C语言基本输入输出库
目录一、前言二、编写前的软硬件环境三、分段加载四、头文件编写五、C文件编写1、类型定义、全局变量定义和库初始化2、定义 fopen 函数3、定义 fclose 函数4、定义 fgetc 函数5、定义 fputc 函数6、定义 fread 函数7、定义 fwrite 函数8、定义 fseek 函数9、定义 ftell 函数10、定义 feof 函数11、一些其他函数的定义六、设备文件示例一、前言在基于单片机软件开发一些比较大的项目的时候,难免需要移植一些开源软件,由于开源软件都是基于c语言标准库开发的。由原创 2021-03-10 11:11:54 · 1955 阅读 · 3 评论 -
Cortex-M单片机中 setjmp、longjmp原理探究及实现
setjmp、longjmp原理探究及实现一、原理1、实验2、猜想二、实现三、调用四、总结一、原理C语言中包含头文件 <setjump.h> 即可实现跨函数跳转,通常用于异常处理,在运行代码出现异常时可以自动跳转到调用setjump函数的位置。1、实验#include "setjmp.h"jmp_buf g_jmp_buf;int div__(int a,int b){ if(b==0) { longjmp(g_jmp_buf,1); }原创 2020-10-25 14:32:17 · 1376 阅读 · 0 评论