KEIL启动与__main函数详解:消除USB通讯协议警告

需积分: 40 29 下载量 11 浏览量 更新于2024-08-09 收藏 361KB PDF 举报
"keil警告-usb的通讯协议 完整版" 在KEIL开发环境中,开发者可能会遇到关于USB通信协议的警告,同时涉及到的关键概念是`__main`函数及其相关配置。`__main`函数是C语言程序的入口点,通常由编译器自动生成,负责初始化运行环境。在KEIL中,`__main`的作用包括初始化全局变量、设置堆栈指针以及处理函数代码的加载位置。 1. `__main`主要作用 - 初始化全局变量:所有全局变量在程序启动时会被赋予默认值或指定的初始值。 - 函数代码拷贝:对于非RAM中的函数代码,需要将其从加载地址复制到执行地址,通常是RAM中的`.data`段。 - 堆栈指针初始化:设置程序运行时的堆栈空间。 2. KEIL启动流程 - 分散加载文件:在KEIL的工程配置中,分散加载文件(scatter loading file)定义了程序内存的布局。如果使用`__main`和微库(通过`OptionsforTarget` -> `Target` -> `Use MicroLIB`选项),必须确保`__main`和微库函数位于`rootregion`,通常是`ER_IROM1`区域。 - 启动文件:当程序上电或复位时,会从指定的地址加载SP和PC。启动文件(startup code)通常由汇编语言编写,负责设置初始的SP和PC,以及调用`__main`函数。 3. `__main`执行过程 - `__main`函数在启动文件执行后被调用,完成上述的初始化任务。 - 如果使用微库,编译器会导出一些特定的标号,供微库中的函数如`malloc`使用。 - 若不使用微库,而是标准的ARMC库,启动文件会提供不同的初始化逻辑。 4. `__main`实现 - 工程配置:在KEIL中,可以通过修改`OptionsforTarget`来选择是否使用微库。 - 函数实现:`__main`函数的具体实现取决于是否使用微库或标准库,以及工程的具体需求。 5. 注意事项 - 当用户自己实现`__main`函数时,虽然ENTRY关键字不再有实质作用,但为了消除KEIL的警告,可以在复位中断的上一行添加ENTRY。 - 分散加载文件中的配置应与实际的存储器布局相匹配,以避免加载和执行时出现问题。 理解这些概念和步骤对于解决KEIL中的USB通信协议警告至关重要,同时也有助于优化和调试嵌入式系统的启动过程。正确配置`__main`和启动文件可以确保程序正确初始化并有效地利用内存资源。