{"id":192,"date":"2019-03-11T20:44:48","date_gmt":"2019-03-11T20:44:48","guid":{"rendered":"http:\/\/jagumiel.xyz\/blog\/?p=192"},"modified":"2025-03-02T13:30:13","modified_gmt":"2025-03-02T13:30:13","slug":"real-time-linux-en-soc-fpga","status":"publish","type":"post","link":"https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/","title":{"rendered":"Real Time Linux en SoC-FPGA. A\u00f1ade Preempt-RT"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>Un sistema operativo Real Time Linux se caracteriza por garantizar que los procesos se ejecuten dentro de un tiempo m\u00e1ximo predefinido. Para lograrlo, el planificador del sistema operativo debe comportarse de manera que esto se cumpla para cualquier proceso, manteniendo un balance correcto para evitar la inanici\u00f3n. La inanici\u00f3n ocurre cuando un proceso de alta prioridad impide que otros con menor importancia accedan a los recursos del sistema, lo que debe evitarse para garantizar un rendimiento estable.<\/p>\n<p>En esta entrada podr\u00eda explicar un poco el concepto de procesos en Linux, de qu\u00e9 es el scheduler, las pol\u00edticas de planificaci\u00f3n, etc. Sin embargo, es tan amplio que de momento s\u00f3lo voy a contar c\u00f3mo hacerlo. Quiz\u00e1s en otra entrada le dedique tiempo al apartado de teor\u00eda.<\/p>\n<h3>\u00bfPor qu\u00e9 elegir un sistema Real Time Linux?<\/h3>\n<p>Un sistema operativo en tiempo real (RTOS) es esencial en aplicaciones cr\u00edticas donde la latencia y la precisi\u00f3n en la ejecuci\u00f3n de procesos son determinantes. En el caso de los SoC-FPGA, la necesidad de tiempos de respuesta predecibles hace que la integraci\u00f3n de un Kernel en tiempo real sea una soluci\u00f3n efectiva.<\/p>\n<h3>Preempt-RT: El parche para un Kernel en tiempo real<\/h3>\n<p>Para habilitar Real Time Linux en SoC-FPGA, se utiliza el parche Preempt-RT en el Kernel de Linux. Este parche permite la preempci\u00f3n de procesos, lo que significa que una tarea en ejecuci\u00f3n puede ser interrumpida y reanudada m\u00e1s tarde sin errores. Esto se logra mediante un cambio de contexto, donde el estado del proceso se almacena para su restauraci\u00f3n posterior.<\/p>\n<h2>Antes de empezar<\/h2>\n<p>Los pasos previos a la compilaci\u00f3n del Kernel es tener Linux funcionando y conocer el Kernel con el que se est\u00e1 trabajando. Para saberlo se recurre al siguiente comando:<br \/><code>uname \u2013a<\/code><\/p>\n<div id=\"attachment_205\" style=\"width: 554px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-205\" class=\"aligncenter size-full wp-image-205\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1.png\" alt=\"\" width=\"544\" height=\"113\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1.png 544w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1-300x62.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1-150x31.png 150w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/a><p id=\"caption-attachment-205\" class=\"wp-caption-text\">Kernel de Linux original.<\/p><\/div>\n<p>Adem\u00e1s hay que tener el sistema operativo con la lista de repositorios y el software actualizado. El proceso de compilaci\u00f3n se podr\u00e1 hacer desde un ordenador convencional, especificando que se va a trabajar con una arquitectura ARM y para un dispositivo SoC-FPGA o desde la propia placa de desarrollo. En el primer caso, el tiempo de compilaci\u00f3n ser\u00e1 menor.<\/p>\n<p>Para actualizar los repositorios y el software usamos los siguientes comandos desde la consola de Linux:<br \/><code>opkg update<br \/>\nopkg upgrade<\/code><\/p>\n<p>Ahora hay que instalar las herramientas y librer\u00edas necesarias para el proceso de compilaci\u00f3n, algunas es probable que ya est\u00e9n instaladas.<br \/><code>opkg install build-essential gcc make libncurses5-dev libssl-dev<br \/>\nopkg install bison flex qt5-default qt5-qmake fakeroot<br \/>\nopkg install qtbase5-dev qtbase5-dev-tools<\/code><\/p>\n<h2>Obteniendo el Kernel para Real Time Linux<\/h2>\n<p>El kernel se puede obtener de la p\u00e1gina kernel.org y descargar tambi\u00e9n de ah\u00ed el parche de Preempt-RT. Ambas versiones deben de coincidir. Se recomienda que, si no hay parche para la misma versi\u00f3n del Kernel que estamos ya utilizando, escoger la siguiente versi\u00f3n en la que ambos coincidan.<\/p>\n<p>Yo he ido a lo m\u00e1s f\u00e1cil, y es que hay un repositorio en GitHub de Altera (Altera-OpenSource) que tiene ya el Kernel con el parche de Preempt-RT listo para compilar, por lo que en mi caso, he decidido bajarlo directamente de ah\u00ed. Hay varios branches, por lo que se puede elegir. Yo he elegido la versi\u00f3n 4.14.73-ltsi-rt. Esta tiene el parche de tiempo real y es de \u201cLong Term Support\u201d.<\/p>\n<h2>Compilaci\u00f3n del Kernel<\/h2>\n<p>Tras la descarga del Kernel, lo descomprimimos en una carpeta. Si en un futuro queremos hacer m\u00f3dulos, que en mi caso as\u00ed ser\u00e1, recomiendo no borrar la carpeta despu\u00e9s de la compilaci\u00f3n.<\/p>\n<p>En la consola tenemos que ir a la ruta donde hemos descomprimido el Kernel. En el caso de estar compil\u00e1ndolo en un ordenador convencional, tendremos que especificar la arquitectura para la que queremos compilarlo y la herramienta o \u201ctool-chain\u201d.<br \/><code>export ARCH=arm<br \/>\nexport CROSS_COMPILE= arm-linux-gnueabihf-<\/code><\/p>\n<p>Si lo estamos haciendo desde la propia placa de desarrollo, se puede omitir este paso, ya que se compilar\u00e1 para esa misma arquitectura.<\/p>\n<p>Los siguientes pasos son establecer la configuraci\u00f3n del \u201cmake\u201d, que para hacerlo hacia dispositivos SoC-FPGA se puede solicitar de forma autom\u00e1tica, y por \u00faltimo, compilar el Kernel generando una imagen comprimida del mismo. Esta imagen se pasar\u00e1 a la tarjeta microSD y se cargar\u00e1 al inicio del sistema.<br \/><code>make socfpga_defconfig<br \/>\nmake \u2013j12 zImage 2&gt;&amp;1 | tee ..\/linux-rt-log.txt<\/code><\/p>\n<p>El pipeline con el commando \u201ctee\u201d y el fichero de texto como destino es para guardar un registro de lo que hace la compilaci\u00f3n, para poder ver donde falla en caso de que haya problemas.<\/p>\n<div id=\"attachment_206\" style=\"width: 579px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-206\" class=\"aligncenter size-full wp-image-206\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1.png\" alt=\"\" width=\"569\" height=\"234\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1.png 569w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1-300x123.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1-150x62.png 150w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/a><p id=\"caption-attachment-206\" class=\"wp-caption-text\">Compilaci\u00f3n terminada con \u00e9xito.<\/p><\/div>\n<p>La compilaci\u00f3n ha terminado con \u00e9xito y nos indica en qu\u00e9 directorio se ha generado la imagen del Kernel, lo comprobamos.<\/p>\n<div id=\"attachment_207\" style=\"width: 579px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-207\" class=\"aligncenter size-full wp-image-207\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1.png\" alt=\"\" width=\"569\" height=\"113\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1.png 569w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1-300x60.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1-150x30.png 150w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/a><p id=\"caption-attachment-207\" class=\"wp-caption-text\">Ubicaci\u00f3n de la imagen del Kernel comprimido.<\/p><\/div>\n<p>A continuaci\u00f3n, copiamos esa imagen en la tarjeta micro SD. Antes de hacerlo, recomiendo hacer una copia de seguridad del Kernel anterior. Tras copiarlo, iniciamos el sistema.<\/p>\n<div id=\"attachment_208\" style=\"width: 554px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-208\" class=\"aligncenter size-full wp-image-208\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1.png\" alt=\"\" width=\"544\" height=\"132\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1.png 544w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1-300x73.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1-150x36.png 150w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/a><p id=\"caption-attachment-208\" class=\"wp-caption-text\">Kernel de Linux con el parche Preempt-RT.<\/p><\/div>\n<p>Si volvemos a introducir el comando \u201cuname \u2013a\u201d, ahora nos aparece una nueva versi\u00f3n del Kernel, y nos indica que tiene el parche Preempt-RT.<\/p>\n<h2>Resultados obtenidos<\/h2>\n<p>Podemos hacer unas pruebas para ver su funcionamiento con la herramienta cyclictest, es de c\u00f3digo abierto y se puede encontrar en el siguiente repositorio. Yo he hecho las pruebas con los dos Kernels, el original y el de RT y se notan las diferencias en la latencia m\u00e1xima. El Kernel Preempt-RT las reduce notablemente y aporta mayor estabilidad.<\/p>\n<div id=\"attachment_209\" style=\"width: 586px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-209\" class=\"aligncenter size-full wp-image-209\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1.png\" alt=\"\" width=\"576\" height=\"289\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1.png 576w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1-300x151.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1-150x75.png 150w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><p id=\"caption-attachment-209\" class=\"wp-caption-text\">Resultados del cyclictest con el Kernel original.<\/p><\/div>\n<p>\u00a0<\/p>\n<div id=\"attachment_210\" style=\"width: 585px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-210\" class=\"aligncenter size-full wp-image-210\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1.png\" alt=\"\" width=\"575\" height=\"246\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1.png 575w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1-300x128.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1-150x64.png 150w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/a><p id=\"caption-attachment-210\" class=\"wp-caption-text\">Resultados del cyclictest con el Kernel parcheado con Preempt-RT.<\/p><\/div>\n\n\t\t<style type=\"text\/css\">\n\t\t\t#gallery-1 {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-item {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 16%;\n\t\t\t}\n\t\t\t#gallery-1 img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t\/* see gallery_shortcode() in wp-includes\/media.php *\/\n\t\t<\/style>\n\t\t<div id='gallery-1' class='gallery galleryid-192 gallery-columns-6 gallery-size-small'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/01-original_kernel-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"544\" height=\"113\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1.png 544w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1-300x62.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/01-Original_Kernel-1-150x31.png 150w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/02-compilation_results-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"234\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1.png 569w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1-300x123.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/02-Compilation_results-1-150x62.png 150w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/03-zimage_destination-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"113\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1.png 569w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1-300x60.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/03-zImage_Destination-1-150x30.png 150w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/04-rt_kernel-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"544\" height=\"132\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1.png 544w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1-300x73.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/04-RT_Kernel-1-150x36.png 150w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/05-original_results-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"289\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1.png 576w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1-300x151.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/05-Original_Results-1-150x75.png 150w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/06-rt_results-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"246\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1.png\" class=\"attachment-small size-small\" alt=\"\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1.png 575w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1-300x128.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/03\/06-RT_Results-1-150x64.png 150w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/a>\n\t\t\t<\/dt><\/dl><br style=\"clear: both\" \/>\n\t\t<\/div>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Descubre c\u00f3mo Real Time Linux optimiza el rendimiento en SoC-FPGA con Preempt-RT, logrando tiempos de respuesta precisos para procesos cr\u00edticos.<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":219,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[23,5,37],"tags":[43,44,40,42,41],"class_list":["post-192","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fpga","category-hardware","category-linux","tag-angstrom","tag-preempt-rt","tag-real-time-linux","tag-soc-fpga","tag-tiempo-real"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":20,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/192\/revisions\/519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media\/219"}],"wp:attachment":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}