1、打开04-Software/ch02/CH02-1-20220118工程目录编译下载运行,理解并学习main.s汇编源文件,并写出main.s中94-101行语句的c语言描述
按照作业1的方式导入工程、编译工程
理解学习main.s汇编源文件
这段代码演示了如何在嵌入式系统中调用GPIO构件控制小灯闪烁,并利用printf输出提示信息。其主要分为几个部分:数据段定义、代码段定义、主函数、主循环。
①数据段定义(.data)
- 定义数据存储data段开始,实际数据存储在RAM中
- 在RAM中定义了一系列字符串和变量,包括用于输出的字符串(hello_information、light_show1、light_show2和light_show3)、格式字符串(data_format和data_format1)以及一些状态变量(mMainLoopCount、mFlag和mLightCount)。
②代码段定义(.text)
- 定义代码存储text段开始,实际代码存储在Flash中
- 使用.thumb指令集,并对函数和指令进行了适当的对齐。
③主函数(main)
- 初始化部分:禁用中断、初始化GPIO和UART用于控制LED和串口通信、使能中断。
- 显示初始化信息:使用printf函数输出hello_information定义的字符串。
④主循环(main_loop)
- 控制程序执行一个循环操作,直到循环次数达到预设的值。
- 测试代码部分:显示机器码存储方式;根据mFlag变量的值('L'或'A'),程序会切换LED的状态(亮或暗),并更新mLightCount变量来记录LED闪烁的次数。
写出main.s中94-101行语句的c语言描述
c语言描述:
#include <stdio.h>
int main()
{
int MainLoopCount = 1; // 初始化MainLoopCount=1
const int MainLoopNUM = 6122338; // 将MainLoopNUM声明为常量,值为6122338
// 当MainLoopCount小于MainLoopNUM时,继续循环
while (MainLoopCount < MainLoopNUM)
{
MainLoopCount++; // 在循环体中递增MainLoopCount
}
// 循环结束后,输出MainLoopCount的值
printf("MainLoopCount=%d\n", MainLoopCount);
return 0;
}
小插曲 :准备开始做本次作业的第二道题时,突然就显示找不到设备了(如下图),微控制器的小灯也不亮了,之前一直把微控制器连着电脑运行也没啥问题。
一开始尝试按微控制器红圈圈出来的按键(复位键),但按了几下发现没啥改变,便以为是电脑有问题。问了老师这种情况,老师让我拿舍友的微控制器连接电脑试试,结果发现可以正常运行。于是又回过头来捣鼓微控制器,不死心又按了好多次微控制器的复位键,突然小灯就亮起来了,就可以了。跟老师说恢复了之后,老师告诉我复位键是需要按6下复位,属于是歪打正着了哈哈哈哈
2、修改main.s源文件,增加以下内容
1、在第一行显示“广州大学”字样。
2、编写一个1+2+..+10的程序,将求和结果存入名为“sumresult”的内存单元中,并将求和结果、sumresult的地址用printf显示出来。
①数据段定义(.data)
- 定义了用于输出的字符串school,用于输出“广州大学”;
- 定义了格式字符串data_format和address_format,分别用于显示求和结果以及地址。由于%d用于打印整数值,%p用于打印指针的内存地址,因此在显示求和结果时需用到%d,显示地址时需用到%p;
- 定义了变量sumresult,用于存储求和结果。
②代码段定义(.text)
③主函数(main)
- 显示school定义的字符串,用r3存储求和结果并初始化求和结果为0,用r2存储需要求和的数并初始化为1。
④主循环(main_loop)
- 因为r2用于存储需要求和的数,因此可以根据r2的大小来判断循环是否继续。本题需要累加1到10,因此可以通过利用r2与值11进行比较,进而判断是否继续循环。
结果: