OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2840|回复: 9

Main程序执行完后,系统干什么?

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-1-16
在线时间
3 小时
发表于 2018-2-17 10:28:54 | 显示全部楼层 |阅读模式
2金钱
在看串口通信部分,看到钱晓捷著《嵌入式系统 导论》第七章范例:int main(void)
{

        char msg[100];
        int temp;
        USART1_Config();
        printf("\r\n 演示串口书输入输出\r\n");
        printf("\r\n 输入一个字符串\r\n");
        scanf("%s",msg);
        printf("\r\n 输入一个整数");
        scanf("%d",&temp);
        printf("\r\n 输入一个整数加100后等于:%d",temp+100);
        printf("\r\n 结束\r\n");

       
}


程序中没有使用循环类语句,程序在执行完以后,系统去做什么了?
实际跟踪测试以及下载测试:每次执行完后,main()被重新加载执行。请问是什么导致了main()重新执行?看门狗吗?又及:这样写程序安全吗?(会不会飞掉?)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-17 15:32:01 | 显示全部楼层
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-1-16
在线时间
3 小时
 楼主| 发表于 2018-2-17 21:08:17 | 显示全部楼层
c语言,编译连接后可以下到板子上用
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-2-18 20:22:18 | 显示全部楼层
几种可能吧:
1、这个得看main代码后面数据,估计main后面是0或者之类的数据(写入过程先全擦除,然后再写入代码,写到main结束,剩下的就是擦除的0数据之类),然后main后面的数据被装入PC寄存器,然后从0开始执行。
2、可能单片机固件的保护机制之类的,在遇到非法指令(main结束后的指令有可能是无效指令)之后自动从头执行。
3、编译器在编译代码的时候加入保护机制,在所有程序执行结束之后加入从头执行的指令。

具体那种,我不懂。
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-2-18 20:54:21 | 显示全部楼层
确实是会重新开始执行,可以看看汇编代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-2-19 21:01:21 | 显示全部楼层
类似于跑飞的效果,不要写这样的代码。
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-1-16
在线时间
3 小时
 楼主| 发表于 2018-2-20 23:05:45 | 显示全部楼层
不安全,不会这样写,是保护机制?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-2-25 02:26:33 | 显示全部楼层
pla250 发表于 2018-2-20 23:05
不安全,不会这样写,是保护机制?

要深入研究,得学习编译原理了,而且得了解MCU的运行机制,看main函数执行完,编译器是怎么处理的,mcu又是怎么执行的。
然而,对一般程序员,然并卵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2018-2-25 13:49:00 | 显示全部楼层
为了防止跑飞,一般会在程序尾部加上while(1);
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-2-25 14:58:22 | 显示全部楼层
mack13013 发表于 2018-2-18 20:22
几种可能吧:
1、这个得看main代码后面数据,估计main后面是0或者之类的数据(写入过程先全擦除,然后再写 ...

赞同,想要深入,可以看看汇编和编译原理,或许有有用的信息。总之要么程序员做的保护,要么编译器做的保护,要么单片机厂商做的保护,都没做的话,程序肯定飞了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表