¿Qué es 'unsigned char near'?

12

Leí una hoja de datos y encontré la variable definida como unsigned char near Sample_X. ¿Qué es esto y en qué difiere unsigned char Sample_X?

oppo
fuente
3
¿quizás le permite al compilador usar pequeñas compensaciones relativas?
Neil_UK
66
Basado en la experiencia parcial con x86 en DOS, esperaría esto con algún tipo de puntero y en un entorno de 16 bits. Sin embargo, lo que el OP citó no parece un puntero y el enlace de la hoja de datos implicaría algo de MCU. Busque la palabra clave "near" en los siguientes dos enlaces: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
viernes
3
Cabe señalar que este es un compilador de extensiones, no estándar C
PlasmaHH
Puede ser sobre CCM. Teniendo en cuenta que el código está dirigido principalmente a una MCU, puede ser una sugerencia indirecta de vinculación por el soporte del compilador para colocarlo en CCM (memoria de núcleo acoplado) si está disponible.
Ayhan
1
FYI, la palabra clave, neares un ejemplo de un especificador de clase de almacenamiento . Le dice al compilador algo acerca de cómo o dónde se debe asignar el almacenamiento para la variable. (Vea la respuesta de filo, más abajo, para más información near).
Solomon Slow

Respuestas:

20

La MCU especificada aquí es una serie Freescale MC9C08 , que utiliza una versión ligeramente mejorada de su arquitectura HC08. Este es un núcleo de 8 bits, que (como muchos de estos) tiene instrucciones más cortas y un acceso más rápido a las direcciones de "página cero" que otros. Las direcciones de página cero tienen solo 8 bits de longitud en lugar de 16 bits, por lo que las instrucciones que hacen referencia a ellas pueden ser de 2 bytes en lugar de 3 y, como resultado, tardan 1 ciclo menos en ejecutarse .

La palabra clave "cerca" le indica al compilador que coloque la variable en "página cero" si es posible, para un mejor rendimiento. Los compiladores escritos específicamente para el desarrollo integrado, como este , generalmente implementan tales extensiones al lenguaje (aquí descrito como "Soporte C para la página cero").

Chromatix
fuente
Me gusta esta respuesta, pero ¿tiene una fuente para su información?
Clonkex
1
Edité la respuesta para proporcionar más detalles y referencias. De hecho, es de la nueva arquitectura HCS08 de Freescale, pero esto es compatible con el código con las arquitecturas HC08 y HC05 más antiguas. Las arquitecturas 6800 y 6502 (ahora positivamente antiguas) también están estrechamente relacionadas.
Chromatix
Bonito, mucho mejor!
Clonkex
Por lo tanto, su uso es muy similar a la registerpalabra clave (para los casos en los que está realmente seguro de que es aquí donde necesita optimización), pero ¿un poco menos extremo?
vsz
Más o menos. La diferencia se debe principalmente al hecho de que las CPU de 8 bits generalmente no tienen un banco de registros per se, solo un solo acumulador y un par de registros de índice. Pero también es análogo al uso de punteros "cercanos" frente a "lejanos" en x86, ya que existe una diferencia en el tamaño de la dirección y en el tiempo que se tarda en completar un acceso.
Chromatix
15

Dependiendo de la arquitectura de la CPU, puede haber diferentes instrucciones para acceder a los datos en diferentes direcciones. Aquí hay un ejemplo de Keil para uno de sus compiladores.

El acceso cercano tiene un cierto límite de memoria, por lo que puede dar pistas al compilador para colocar algunas variables de uso frecuente en un área accesible mediante instrucciones más cortas (obviamente, describir que el acceso a un espacio de direcciones de 32 bits es mayor que la dirección de 16 bits espacio). Esto se puede traducir a un código más pequeño / más rápido.

filo
fuente
77
Hay más información en ¿Cuál es la diferencia entre punteros lejanos y punteros cercanos?
Andrew Morton el
55
@ AndrewMorton: Esa pregunta se relaciona fary nearapunta a la arquitectura 8086 en gran parte obsoleta. Las mismas palabras clave se usan de manera relacionada pero diferente en microcontroladores de 8 bits.
supercat
@supercat La pregunta solo se hace en general, aunque las respuestas se centran en la arquitectura antigua. Alguien con conocimientos debería escribir una respuesta explicando cómo se usan para los microcontroladores de 8 bits.
curiousdannii
@curiousdannii: El código en cuestión fue escrito para un micro de 8 bits.
supercat