cursor pin
时间: 2023-09-26 07:11:54 浏览: 43
游标固定(Cursor Pinning)是一种Oracle数据库中的性能优化技术。它用于确保SQL查询在多次执行时使用相同的执行计划,即使输入参数发生变化。当一个SQL查询被执行时,Oracle会根据给定的输入参数生成一个执行计划,并将该计划存储在共享池中以供以后的执行使用。但是,如果输入参数发生变化,Oracle可能会生成一个新的执行计划,这可能导致性能下降。
游标固定通过将游标与特定的执行计划绑定在一起来解决这个问题。当一个SQL查询被执行时,Oracle会检查共享池中是否存在相同的执行计划。如果存在,Oracle会重用该执行计划,而不管输入参数的变化。这样可以避免重新生成执行计划的开销,并提高查询性能。
要启用游标固定,可以使用以下语句:
ALTER SYSTEM SET cursor_sharing = 'FORCE';
这将强制Oracle将所有具有相同文本的SQL查询使用相同的执行计划,而不考虑输入参数的不同。请注意,启用游标固定可能会导致一些副作用,例如在某些情况下可能会导致错误的结果返回。因此,在使用游标固定之前,建议仔细评估其对应用程序性能和功能的影响。
相关问题
请帮我优化这段代码include <reg52.h> #include <stdio.h> #include <string.h> #define LCD_DATA P0 #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LED_PIN P1_0 #define BUZZER_PIN P1_1 void delay(unsigned int ms); void LCD_init(); void LCD_command(unsigned char cmd); void LCD_data(unsigned char dat); void LCD_string(char *str); void LCD_clear(); void UART_init(); void UART_sendChar(unsigned char ch); void UART_sendString(char *str); unsigned char UART_receiveChar(); void executeCommand(char *command); void main() { char command[20]; UART_init(); LCD_init(); while (1) { if (UART_receiveChar() == ':') { UART_receiveChar(); // Ignore space after ':' fgets(command, sizeof(command), stdin); executeCommand(command); UART_sendString(command); // Send back the received command } } } void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 110; j++); } void LCD_init() { LCD_command(0x38); // 2 lines, 5x7 matrix LCD_command(0x0C); // Display on, cursor off LCD_command(0x06); // Increment cursor LCD_command(0x01); // Clear display delay(2); } void LCD_command(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; LCD_DATA = cmd; delay(2); LCD_EN = 0; } void LCD_data(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; LCD_DATA = dat; delay(2); LCD_EN = 0; } void LCD_string(char *str) { while (*str) { LCD_data(*str++); } } void LCD_clear() { LCD_command(0x01); // Clear display delay(2); } void UART_init() { TMOD = 0x20; // Timer1 mode 2: 8-bit auto-reload TH1 = 0xFD; // 9600 baud rate SCON = 0x50; // Serial mode 1: 8-bit data, 1 stop bit, receive enabled TR1 = 1; // Start Timer1 } void UART_sendChar(unsigned char ch) { SBUF = ch; while (TI == 0); // Wait for transmission to complete TI = 0; // Clear transmission flag } void UART_sendString(char *str) { while (*str) { UART_sendChar(*str++); } } unsigned char UART_receiveChar() { while (RI == 0); // Wait for reception to complete RI = 0; // Clear reception flag return SBUF; } void executeCommand(char *command) { if (strncmp(command, "LED on", 6) == 0) { LED_PIN = 1; } else if (strncmp(command, "buzzer on", 9) == 0) { BUZZER_PIN = 1; } else if (strncmp(command, "showstr", 7) == 0) { char *str = command + 8; // Get the string after "showstr" LCD_clear(); LCD_command(0x80); // Move cursor to the beginning of the first line LCD_string(str); } }
这段代码可以进行如下的优化:
1. 将LCD的RS、RW、EN引脚的控制函数封装成一个公共函数,避免代码重复。
2. 可以使用宏定义或枚举类型来定义LED_PIN和BUZZER_PIN,提高代码的可读性。
3. 在executeCommand函数中,可以使用switch-case语句来代替if-else语句,提高代码的可读性。
4. 在UART_receiveChar函数中,可以使用do-while循环来代替while循环,提高代码的可读性。
5. 在executeCommand函数中,可以使用strtok函数来解析命令字符串,提高代码的可读性。
6. 在executeCommand函数中,可以使用strcmp函数来比较字符串,避免使用strncmp函数时出现错误。
7. 在执行LED_PIN = 1或BUZZER_PIN = 1之前,可以先检查这些引脚是否已经被初始化为输出模式,避免出现意外错误。
8. 在executeCommand函数中,可以添加一些错误处理代码,以防止出现错误的命令。
9. 可以添加注释,提高代码的可读性。
下面是优化后的代码:
编写stm32f103c6t6用LCD1602显示数字的代码
好的,以下是使用stm32f103c6t6控制LCD1602显示数字的代码,供参考:
```c
#include "stm32f10x.h"
#include "delay.h"
void LCD_Init(void);
void LCD_Write_Command(uint8_t command);
void LCD_Write_Data(uint8_t data);
void LCD_Write_String(char* string);
void LCD_Clear(void);
void LCD_Set_Cursor(uint8_t row, uint8_t column);
int main(void)
{
SystemInit();
SysTick_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Enable GPIOA clock
GPIO_InitTypeDef GPIO_InitStructure;
// Configure PA0-PA5 as push-pull outputs
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
LCD_Init(); // Initialize LCD
while(1)
{
LCD_Set_Cursor(0, 0); // Set cursor to first row, first column
LCD_Write_String("Counter:"); // Write string to LCD
LCD_Set_Cursor(1, 0); // Set cursor to second row, first column
LCD_Write_Data('0'); // Write data to LCD
Delay_ms(1000); // Delay for 1 second
}
}
void LCD_Init(void)
{
LCD_Write_Command(0x38); // Initialize 8-bit mode
LCD_Write_Command(0x0C); // Turn on display, cursor, and blink
LCD_Write_Command(0x01); // Clear display
LCD_Write_Command(0x06); // Set direction of entry
}
void LCD_Write_Command(uint8_t command)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // Set RS pin to 0
GPIO_Write(GPIOA, (command << 2)); // Write command to data pins
GPIO_SetBits(GPIOA, GPIO_Pin_1); // Set EN pin to 1
Delay_us(1); // Delay for 1us
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // Set EN pin to 0
Delay_ms(1); // Delay for 1ms
}
void LCD_Write_Data(uint8_t data)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0); // Set RS pin to 1
GPIO_Write(GPIOA, (data << 2)); // Write data to data pins
GPIO_SetBits(GPIOA, GPIO_Pin_1); // Set EN pin to 1
Delay_us(1); // Delay for 1us
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // Set EN pin to 0
Delay_ms(1); // Delay for 1ms
}
void LCD_Write_String(char* string)
{
while(*string) // Loop through each character in string
{
LCD_Write_Data(*string++); // Write character to LCD
}
}
void LCD_Clear(void)
{
LCD_Write_Command(0x01); // Clear display
}
void LCD_Set_Cursor(uint8_t row, uint8_t column)
{
uint8_t address = (row * 0x40) + column; // Calculate address of cursor
LCD_Write_Command(0x80 | address); // Set cursor to address
}
```
在这个例子中,我们使用PA0-PA5(即D0-D5)控制LCD1602,PA0作为RS,PA1作为EN。我们使用delay.h中的延迟函数来控制LCD的操作时间。在main函数中,我们设置LCD光标,写入字符串“Counter:”,然后设置光标到第二行第一列,写入数字0。最后我们使用1秒的延迟,然后重复这个过程。
当然,这只是一个例子,你可以根据自己的需求修改代码。同时,为了让代码更加易懂,我建议你在使用之前先阅读LCD1602的数据手册。