Advertisement

在MAIN程序运行时,启动和复位过程需要结合FreeRTOS进行操作。

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
5.10 MAIN 标识符、运行时启动和复位机制:MAIN 是一种具有特殊意义的标识符。在程序设计中,必须保证存在且仅存在一个名为 main() 的函数。该函数在程序执行过程中是首个被调用的函数。然而,与 main() 函数相关的代码并非在复位后立即执行,而是会先执行额外的代码,即编译器提供的运行时启动代码。此代码负责将控制流程转移到 main() 函数。后续几节将详细阐述该代码的功能以及其控制方式。编译器会在 main() 函数的结尾插入特定的代码片段,这些代码会在函数执行完毕后(即当 main() 函数内的 return 语句被执行,或者程序执行到达 main() 函数的结束右大括号时)触发。这种特殊的代码会导致程序跳转到地址 0,这对于所有 8 位 PIC 器件而言,相当于一种软件复位操作。值得注意的是,软件复位后的寄存器状态可能与硬件复位后的状态有所不同。为了确保程序的稳定运行,建议在 main() 函数内部避免其自然结束。可以考虑在 main() 函数外部或其末尾添加一个不会终止的循环(例如 while(1)),从而使该函数的执行得以持续进行。例如:void main(void){ // 这里可以放置程序的主要逻辑 // 完成后,进入等待中断状态 while(1) continue;}5.10.1 运行时启动代码 C 程序通常需要对某些特定对象进行初始化设置,并且器件需要处于某种特定的状态才能开始执行其主函数 (main()) 。运行时启动代码正是负责完成这些任务的工作,特别是以下几个方面:• 初始化在定义时已经赋予值的全局变量• 清零未初始化的全局变量• 对寄存器或器件的状态进行常规设置。与传统的链接通用预编译程序的方法不同,MPLAB XC8 采用了更加高效的方式来生成运行时启动代码——根据用户的程序需求动态地确定所需的启动代码内容。第 4.4.2 节“启动和初始化”详细介绍了所使用的文件以及如何控制这一过程。后续几节将深入探讨运行时启动代码的具体运作原理。运行时启动代码会在 main() 函数之前被执行;但如果需要在复位后立即执行一些特殊的初始化操作,则应参考第 5.10.2 节 “上电功能”中介绍的上电功能的使用方法。下表列出了用于启动和上电过程中的关键汇编标号(见表 5-12)。表 5-12:重要的汇编标号标号 位置 reset_vec 复位向量单元处 (0x0)powerup 上电程序开始处 (如使用)start startup.as 中的运行时启动代码的开始处 start_initialization C 输出代码中的 C 初始化启动代码的开始处 DS50002053D_CN 第 204 页 © 2013-2014 Microchip Technology Inc.

全部评论 (0)

还没有任何评论哟~
客服
客服
  • FREERTOS使用教MAIN函数的
    优质
    本教程详细介绍了FreeRTOS操作系统中MAIN函数的启动和复位操作方法,帮助开发者快速掌握其基本用法。适合初学者参考学习。 5.10 主函数与运行启动标识符 `main()` 是一个特殊的标识符,在程序中必须且只能存在一个名为 `main()` 的函数。它是执行的第一个函数,但其关联的代码并非复位后最先执行的部分。编译器提供的额外代码(称为运行时启动代码)会在 `main()` 之前先行执行,并负责将控制权转移到 `main()` 函数。 在程序结束或`main()`内的return语句被执行之后,或者当代码到达`main()`函数的终止大括号时,编译器会插入一段特殊的退出代码。这段特殊代码会导致执行跳转到地址0处(即所有8位PIC设备的复位向量),实际上这相当于一次软件重启操作。需要注意的是,在软件重启后寄存器的状态可能不同于硬件复位后的状态。 建议不要让`main()`函数结束,而是在其外围或末尾添加一个永远不会终止的循环如 `while(1)` 以确保程序持续运行: ```c void main(void) { // your code here while (1) continue; } ``` 5.10.1 运行时启动代码 C语言程序在执行`main()`函数前需要进行一系列初始化操作,包括但不限于:全局变量的初始化和清零、对寄存器或设备状态的基本设置等。这些任务由运行时启动代码完成。 与传统预编译方法不同的是,MPLAB XC8会根据用户的具体需求来决定所需的运行时启动代码内容,并在相关文件中进行控制(具体信息请参考第4.4.2节“启动和初始化”)。 下表列出了用于描述启动及上电过程的重要汇编标号: - `reset_vec`:复位向量单元处 (0x0) - `powerup`:如果使用,为上电程序的开始位置 - `start`:运行时启动代码在startup.as中的起始点 - `start_initialization`: C输出代码中C初始化启动代码的起点
  • 并隐藏开机
    优质
    本教程详解如何配置应用程序于电脑启动时自动运行且保持隐藏状态,适合追求系统简洁和隐私保护的用户。 本段落介绍了三种自动启动程序的方法:开机启动并隐藏进程的源码。这些方法包括写入注册表、创建快捷方式等方式。
  • STM32F103解析
    优质
    本文章详细解析了基于ARM内核的STM32F103芯片在上电后的初始化流程及用户应用程序的加载执行机制,为开发者深入了解该系列微控制器提供指导。 STM32启动过程解析:本段落详细介绍了STM32的启动流程。
  • 使用UIAutomator应用
    优质
    本简介介绍了如何利用UIAutomator框架启动并控制Android设备上的应用,涵盖基本命令及脚本编写技巧。适合自动化测试人员学习参考。 为了在安卓设备上实现应用的自动化测试并跨其他应用操作,需要对设备进行root,并且要获取系统签名权限。
  • Windows服务一个弹出窗口
    优质
    当Windows服务试图启动并执行某个应用程序时出现弹窗提示,通常表明存在权限问题、配置错误或依赖项缺失。解决此问题需检查服务账户设置及目标应用兼容性。 Windows服务默认在Session 0运行,并不在当前桌面。因此,在这种环境下启动的应用程序也会处于Session 0中,导致你无法看到其界面。若要使应用程序显示在用户桌面上,则需要使用CreateProcessAsUser函数来启动该程序。
  • MFC
    优质
    《MFC程序的运行过程》简介:本文详细解析了基于Microsoft Foundation Classes(MFC)开发的应用程序从启动到结束的整体流程,包括初始化、消息循环及窗口处理机制等关键环节。 MFC程序的执行流程非常详细且经典。从初始化到创建窗口、消息循环以及处理各种用户输入事件,每个步骤都清晰明了。通过深入理解这些过程,开发者可以更好地掌握MFC框架的工作原理,并在此基础上开发出功能强大的应用程序。
  • SeleniumChromedriver 120.0.6046.0-win64Python自
    优质
    本项目介绍如何使用Selenium与ChromeDriver版本120.0.6046.0-win64在Python中实现网页自动化操作,涵盖环境配置及示例代码。 项目介绍: 该案例是利用selenium使用xls中的数据对表单进行自动化填充及提交。 该项目用到了chromedriver版本为120.0.6046.0,系统要求win10 64位,并需要安装谷歌浏览器120.*版本。 通过该项目你可以学习到: 1、selenium自动化操作的基本步骤 2、利用xlwings读取xls数据 3、各版本的谷歌浏览器和chromedriver可以在其官方网站找到下载地址。
  • STM32FATFSSDIOTF卡读写
    优质
    本项目介绍如何使用STM32微控制器通过SDIO接口配合FATFS文件系统实现对TF卡的数据读取与写入功能,适用于嵌入式存储应用开发。 使用STM32配合FATFS和SDIO进行TF卡的读写操作,包括创建文件、写入数据到文件以及从文件中读取数据,并能够获取存储卡的容量。
  • SpringBootMyBatis-PlusMySQL,配微信小简单CRUD的项目.zip
    优质
    本项目为一个使用Spring Boot框架集成MyBatis-Plus与MySQL数据库,并通过微信小程序实现增删改查功能的简易应用。 使用SpringBoot结合MyBatis-Plus与MySQL数据库,并通过微信小程序实现简单的增删改查功能。
  • 逻辑表达式求解中,并非所有逻辑算符都会被执,仅某个算符以得出才会计算。
    优质
    此段落探讨了逻辑表达式的求解机制,强调只有当特定运算符对确定最终结果有影响时才被实际计算,从而优化处理过程。 if语句有三种形式:1) if(表达式) 语句 如 if(x>y) printf(%d,x); 2) if(表达式) 语句1 else 语句2 如 if(x>y) printf(%d,x); else printf(%d,y); 3) if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 ... else if(表达式m) 语句m else 语句n。