Chip_GPIO_SetPortOutHigh() vs Chip_GPIO_SetPinState()

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Chip_GPIO_SetPortOutHigh() vs Chip_GPIO_SetPinState()

780 Views
giusloq
Contributor III

I'm using the LPC1768 connected to a ILI9341-based LCD module through a 16-bits data bus and RD/WR/RS control signals. I'm using emWin libraries.

I'm trying to decrease the time the MCU needs to refresh the display. The most important function used by emWin to draw on the display is the following:

void LCD_X_8080_16_WriteM01_16(U16 * pData, int NumWords) {
  Chip_GPIO_SetPortOutHigh(LPC_GPIO, PORT_LCD_CONTROL, 1 << PINBIT_LCD_RS);
  //Chip_GPIO_SetPinState(LPC_GPIO, PIN_LCD_RS, 1);
  for (; NumWords; NumWords--) {
    LCD_X_8080_16_Write(*pData);
    pData++;
  }
}

As you can see I'm trying to choose the faster function between Chip_GPIO_SetPortOutHigh() and Chip_GPIO_SetPinState(). In theory, Chip_GPIO_SetPortOutHigh()  should be faster because writes directly to .SET register, while Chip_GPIO_SetPinState() reads .SET register, make an OR with a bit, and writes back to .SET.

The output listings demonstrates what I say: the Chip_GPIO_SetPinState() needs an additional instruction.

000009e0 <LCD_X_8080_16_WriteM01_16>: SetPinState
 9e0: 4b0a ldr r3, [pc, #40] ; (a0c <LCD_X_8080_16_WriteM01_16+0x2c>)
 9e2: 699a ldr r2, [r3, #24]
 9e4: f442 7200 orr.w r2, r2, #512 ; 0x200
 9e8: 619a str r2, [r3, #24]
 9ea: b169 cbz r1, a08 <LCD_X_8080_16_WriteM01_16+0x28>
 9ec: b430 push {r4, r5}
 9ee: 4d08 ldr r5, [pc, #32] ; (a10 <LCD_X_8080_16_WriteM01_16+0x30>)
 9f0: eb00 0141 add.w r1, r0, r1, lsl #1
 9f4: f44f 7280 mov.w r2, #256 ; 0x100
 9f8: f830 4b02 ldrh.w r4, [r0], #2
 9fc: 61da str r2, [r3, #28]
 9fe: 4288 cmp r0, r1
 a00: 802c strh r4, [r5, #0]
 a02: 619a str r2, [r3, #24]
 a04: d1f8 bne.n 9f8 <LCD_X_8080_16_WriteM01_16+0x18>
 a06: bc30 pop {r4, r5}
 a08: 4770 bx lr
 a0a: bf00 nop
 a0c: 2009c000 .word 0x2009c000
 a10: 2009c036 .word 0x2009c036
  
000009d8 <LCD_X_8080_16_WriteM01_16>: SetPortOut
 9d8: 4b09 ldr r3, [pc, #36] ; (a00 <LCD_X_8080_16_WriteM01_16+0x28>)
 9da: f44f 7200 mov.w r2, #512 ; 0x200
 9de: 619a str r2, [r3, #24]
 9e0: b169 cbz r1, 9fe <LCD_X_8080_16_WriteM01_16+0x26>
 9e2: b430 push {r4, r5}
 9e4: 4d07 ldr r5, [pc, #28] ; (a04 <LCD_X_8080_16_WriteM01_16+0x2c>)
 9e6: eb00 0141 add.w r1, r0, r1, lsl #1
 9ea: f44f 7280 mov.w r2, #256 ; 0x100
 9ee: f830 4b02 ldrh.w r4, [r0], #2
 9f2: 61da str r2, [r3, #28]
 9f4: 4288 cmp r0, r1
 9f6: 802c strh r4, [r5, #0]
 9f8: 619a str r2, [r3, #24]
 9fa: d1f8 bne.n 9ee <LCD_X_8080_16_WriteM01_16+0x16>
 9fc: bc30 pop {r4, r5}
 9fe: 4770 bx lr
 a00: 2009c000 .word 0x2009c000
 a04: 2009c036 .word 0x2009c036

However my oscilloscope says Chip_GPIO_SetPinState() is faster than Chip_GPIO_SetPortOutHigh().

Could you argue what is the reason?

Labels (2)
Tags (1)
0 Kudos
1 Reply

453 Views
soledad
NXP Employee
NXP Employee

Hi,

Could you please comment the way you are taking this measure in order to replay the issue?Did you test using only this functions?
Have a great day,
Sol

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos