这里写目录标题
洛谷题分析
1、接水
#include <stdio.h>
int main()
{
int a[1000][2],n=0,i=0,j=0,temp=0,sum=0;
scanf("%d",&n);
for (i=0; i<n; i++)
{
scanf("%d",&a[i][0]);
a[i][1]=i;
}
for (i=0; i<n; i++)
for (j=i; j<n; j++)
if (a[i][0]>a[j][0])
{
temp=a[j][0];
a[j][0]=a[i][0];
a[i][0]=temp;
temp=a[j][1];
a[j][1]=a[i][1];
a[i][1]=temp;
}
for (i=0; i<n; i++)
{
printf("%d ",a[i][1]+1);
sum+=a[i][0]*(n-i-1);
}
printf("\n%.2f",(double)sum/n);
return 0;
}
一开始没理解题,对这个等待时间没理解好,以为就是按时间从短到长排列,之后问了问才知道是第三个人的等待时间就是前两个人的打水时间之和。
大题思路就是,定义一个二维数组,第一列输入n个人的打水时间,第二列输入1~n个数,让两列同时换顺序,最后输出第二列数组,就是排序后时间的之前的下标+1。
这个计算等待时间之和的一个巧妙的方法是查到的,就是一共有n个人,第一个人打水,等待时间就是第一个人的时间
T1 X(n-1),第二个人就是T2 X (n-2),写成代码就是sum+=a[i][0]*(n-i-1);
还有就是这个接水的得了82分,我也不知道哪里出了问题.-_-.
2、倒排
#include<stdio.h>
int main()
{ int n=0,j=0,a[100];
while(a[n]!=0)
{
n++;
scanf("%d",&a[n]);
}
for(j=n-1;j>=1;j--)
printf("%d ",a[j]);
return 0;
}
这个一开始用length也做了一下,代码比这个要多,还比较麻烦,洛谷还过不去,对于洛谷的格式,正在一步一步摸索中。
学习内容与笔记
一、NVIC 中断优先级管理
1、中断优先级分组
-
STM32 将中断分为 5 个组,组 0~4。该分组的设
置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系图所示:
-
上图为组 0~4 对应的配置关系,例如组设置为 3,此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。
-
*数值越小所代表的优先级就越高。* (应该是0高于1,3高于2的意思)
(例子·:假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。)
上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!这个例子可以解释上下文 .-_-.
- 抢占优先级&响应优先级的区别:
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,就哪个先执行;
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
高优先级的抢占优先级是可以打断正在进行的低抢占优先级
中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
2、中断优先级设置
- NVIC 中断管理函数主要在 misc.c 文件里面。
首先要讲解的是中断优先级分组函数,其函数申明如下:
void NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);
这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。这个函数我们可以找到其实现:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
从函数体可以看出,这个函数唯一目的就是通过设置 SCB->AIRCR 寄存器来设置中断优先级分组。
- 其入口参数通过双击选中函数体里面的
“IS_NVIC_PRIORITY_GROUP”然后右键“Go to defition of …”可以查看到为:
#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0)||
((GROUP) == NVIC_PriorityGroup_1) ||
((GROUP) == NVIC_PriorityGroup_2) ||
((GROUP) == NVIC_PriorityGroup_3) ||
((GROUP) == NVIC_PriorityGroup_4))
设置整个系统的中断优先级分组值为 2的方法是:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这就是确定了一共为“2 位抢占优先级,2 位响应优先级”。
- 确定每个中断的抢占优先级和响应优先级,一个重要的函数为中断初始化函数 NVIC_Init,其函数申明为:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
其中 NVIC_InitTypeDef 是一个结构体,结构体的成员变量:
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
结构体还没学,我之后补一补
三个变量的作用:
NVIC_IRQChannel:定义初始化的是哪个中断,这个可以在 stm32f10x.h 中找到每个中断对应的名字。例如USART1_IRQn。
NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占 优先级别。
NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
NVIC_IRQChannelCmd:该中断是否使能。
//比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,
//子优先级位 2,初始化的方法是:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器
3、总结
- 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为 NVIC_PriorityGroupConfig();
- 设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();
二、串行通信原理讲解
1、处理器与外部设备通信的两种方式
并行通信
传输原理:数据各个位同时传出
优点:速度快
缺点:占用引脚多
(用的通信线多,成本高,不宜进行远距离通信)
串行通信(下面)
传输原理:数据按位顺序传出
优点:占用引脚资源少
缺点:速度较慢
(比如要传输8个比特的数据,并行通信可以用8个通信口引脚,同时传输:串行通信就一个比特的传,只用一个引脚)
2、串行通信
按照数据传输方向分为:
单工:只支持数据在一个方向传输
半双工:同一时间只能一个方向传输,两边都有接收发送的能力
全双工:同时双向,互不影响,互相独立
通信方式
同步通信:
带时钟同步信号传输。-SPI , IIC 通信接口
异步通信:
不带时钟同步信号。-UART(通用异步收发器),单总线,有约定(1.采用同波特率的方式,2.采用高低电平时常约定)
(例:同步通信是在时钟的带领下进行通信的:异步通信需要双方约定好,A要传给B,比如告诉B传输的频率。)
串口异步通信需要定义的参数
- 起始位
- 数据位(8位或者9位)
- 奇偶校验位(第9位)
- 停止位(1,15,2位)
- 波特率设置
学了一个奇偶校验的知识:奇校验就是第9位写上1或0,让前边的1为单数,偶校验同理。
但是不理解奇偶校验是干什么的,校验什么呢?
在博客上查就是串口通信一般都有奇偶校验,也可以不校验,这是怎么一回事?
STM32的串口通信接口
UART:通用异步收发器
USART:通用同步异步收发器
本周总结
1、算法题乍一看感觉简单,其实是没看好题,写程序也各种出错,还是得先把逻辑屡清楚,然后再写代码,我感觉用纸和笔找一组数划拉一遍会很有用,想的话脑袋不够用。
2、32学习感觉有点慢,而且很多都不太理解,还是得多看,多分析,看博客真的很有用。就各种小的东西都可以细细了解。