stm32是如何跳入中断服务函数的

在main函数里也没有提到过它的调用 中断服务函数到底是怎么调用的

img

img

就像这样 用的是正点原子mini开发板的寄存器版本的例程

产生中断后由硬件跳转,代码里看不出调用

去看中断向量表 在.s文件中

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7640463
  • 这篇博客也不错, 你可以看下STM32串口协议概念及结构体初始化详解+串口点灯+串口收发程序
  • 除此之外, 这篇博客: stm32的串口通信以及全局变量、局部变量、堆、栈等概念中的 三、C语言程序里全局变量、局部变量、堆、栈等概念,在ubuntu系统中编程,输出信息进行验证 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起。普通局部变量保存在堆栈中。
    在C\C++中,通常可以把内存理解为4个分区:栈、堆、全局/静态存储区和常量存储区
    (1) 内存栈区stack: 存放局部变量名;
    (2) 内存堆区heap: 存放new或者malloc出来的对象;
    (3)Text & Data & Bss:代码段与静态分配
    (4) BSS区(未初始化数据段):并不给该段的数据分配空间,仅仅是记录了数据所需空间的大小。
    (5)DATA(初始化的数据段):为数据分配空间,数据保存在目标文件中。
    1.在ubuntu中新建一个1.c文件,输入以下代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    void before()
    {
    }
    char g_buf[16];
    char g_buf2[16];
    char g_buf3[16];
    char g_buf4[16];
    char g_i_buf[]="123";
    char g_i_buf2[]="123";
    char g_i_buf3[]="123";
    void after()
    {
    }
    int main(int argc, char **argv)
    {
            char l_buf[16];
            char l_buf2[16];
            char l_buf3[16];
            static char s_buf[16];
            static char s_buf2[16];
            static char s_buf3[16];
            char *p_buf;
            char *p_buf2;
            char *p_buf3;
            
            p_buf = (char *)malloc(sizeof(char) * 16);
            p_buf2 = (char *)malloc(sizeof(char) * 16);
            p_buf3 = (char *)malloc(sizeof(char) * 16);
     
            printf("g_buf: 0x%x\n", g_buf);
            printf("g_buf2: 0x%x\n", g_buf2);
            printf("g_buf3: 0x%x\n", g_buf3);
            printf("g_buf4: 0x%x\n", g_buf4);
     
            printf("g_i_buf: 0x%x\n", g_i_buf);
            printf("g_i_buf2: 0x%x\n", g_i_buf2);
            printf("g_i_buf3: 0x%x\n", g_i_buf3);
     
            printf("l_buf: 0x%x\n", l_buf);
            printf("l_buf2: 0x%x\n", l_buf2);
            printf("l_buf3: 0x%x\n", l_buf3);
     
            printf("s_buf: 0x%x\n", s_buf);
            printf("s_buf2: 0x%x\n", s_buf2);
            printf("s_buf3: 0x%x\n", s_buf3);
     
            printf("p_buf: 0x%x\n", p_buf);
            printf("p_buf2: 0x%x\n", p_buf2);
            printf("p_buf3: 0x%x\n", p_buf3);
     
            printf("before: 0x%x\n", before);
            printf("after: 0x%x\n", after);
            printf("main: 0x%x\n", main);
     
            if (argc > 1)
            {
                    strcpy(l_buf, argv[1]);
            }
            return 0;
    }
    

    执行后如下:
    在这里插入图片描述可以看出,这些地址呈递增关系。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^