PULP Community
Error at GPIO input interrupt example - Printable Version

+- PULP Community (https://pulp-platform.org/community)
+-- Forum: PULP's Community forum (https://pulp-platform.org/community/forumdisplay.php?fid=1)
+--- Forum: PULP General questions (https://pulp-platform.org/community/forumdisplay.php?fid=2)
+--- Thread: Error at GPIO input interrupt example (/showthread.php?tid=288)



Error at GPIO input interrupt example - ivanhira - 05-04-2022

Hi, 

I'm trying to simulate Pulpissimo using the test examples from pulp-rt-examples. I'm using the releases v7.0.0 of Pulpissimo, with some modifications at pad_control.sv fixing the mux indexes for the last six PADs. I've tried with the GPIO input, all PADs works. The problem was in the GPIO input interrupt example, the code works fine testing one GPIO pin at a time, but I wanted to test multiple pins by setting events with the same function handler in all pins. Doing that, the first and second PADs works fine, but it fails at the third PAD.

Here is the transcript in Questasim:

PHP Code:
<?php 
run 13ms
# [CORE] Core settings: PULP_SECURE =           1, N_PMP_ENTRIES =          16, N_PMP_CFG           4
# [TB]       0ns - Entry point is set to 0x1c008080
# [TB]       0ns - Asserting hard reset
# ** Warning: (vsim-3533) [FOFIW] - Failed to open file "fs/file_0_0.txt" for writing.
# No such file or directory. (errno = ENOENT)    : /home/ivan.hirata/cadence_wd/616/tsmc18_miniasic17_wd/pulpissimo-caninos/sim/../rtl/tb/tb_fs_handler.sv(269)
#    Time: 0 ps  Iteration: 0  Instance: /tb_pulp/i_fs_handler/FS_PRINTF_CLUSTER
# ** Warning: (vsim-3533) [FOFIW] - Failed to open file "fs/file_31_0.txt" for writing.
# No such file or directory. (errno = ENOENT)    : /home/ivan.hirata/cadence_wd/616/tsmc18_miniasic17_wd/pulpissimo-caninos/sim/../rtl/tb/tb_fs_handler.sv(269)
#    Time: 0 ps  Iteration: 0  Instance: /tb_pulp/i_fs_handler/FS_PRINTF_FC
# [TB]       1ns - Using FLL
# [TB]       1ns - Not using CAM SDVT
# Loading default stimuli
# [JTAG] SoftReset Done(    701ns)
# [JTAG] Bypass Test Passed (  33301ns)
# [JTAG] Tap ID: 249511c3 (  43701ns)
# [JTAG] Tap ID Test PASSED (  43701ns)
# [test_mode_if]   50301ns - Init
# [TB]   50301ns - Enabling clock out via jtag
# [test_mode_if]   51801ns - Setting confreg to value 002.
# [TB]   51801ns - jtag_conf_reg set to 002
# [TB]   51801ns - Releasing hard reset
# [TB]   53401ns - Init PULP TAP
# [pulp_tap_if] WRITE32 burst @1c008080 for           4 bytes.
# [TB]   67501ns - Write32 PULP TAP
# [JTAG] R/W test of L2 succeeded
# [TB]  177701ns - Halting the Core
# [TB]  236501ns - Writing the boot address into dpc
# [TB]  280601ns - Loading L2 via JTAG
# [JTAG] Loading L2 with pulp tap jtag interface
# [pulp_tap_if] WRITE32 burst @1c000000 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c000400 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c000800 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c000c00 for         840 bytes.
# [pulp_tap_if] WRITE32 burst @1c008000 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c008400 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c008800 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c008c00 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c009000 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c009400 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c009800 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c009c00 for        1024 bytes.
# [pulp_tap_if] WRITE32 burst @1c00a000 for         832 bytes.
# [pulp_tap_if] WRITE32 burst @1c010000 for         240 bytes.
# [TB] 10977201ns - Resuming the CORE
# [TB] 11550701ns retrying debug reg access
# [TB] 11580001ns retrying debug reg access
# [TB] 11609301ns retrying debug reg access
# [TB] 11638601ns retrying debug reg access
# [TB] 11667901ns retrying debug reg access
# [TB] 11697201ns retrying debug reg access
# [TB] 11726501ns retrying debug reg access
# [TB] 11755801ns retrying debug reg access
# [TB] 11799801ns - Waiting for end of computation
force -freeze pad_spim_sdio0 1 0, 0 20us
run 1ms
# [STDOUT-CL31_PE0] Got edge.
force -freeze pad_spim_sdio1 1 0, 0 20us
run 1ms
# [STDOUT-CL31_PE0] Got edge.
force -freeze pad_spim_sdio2 1 0, 0 20us
run 1ms
# 15001366ns: Illegal instruction (core 0) at PC 0x00000000:
# [STDOUT-CL31_PE0] [ [35mRT(31,0) [0m]  [33mWARNING [0m: Reached illegal instruction (PC: 0x0, opcode: 0x0
# [TB] 15302201ns - Received status core: 0x7fffffff
# ** Note: $stop    : /home/ivan.hirata/cadence_wd/616/tsmc18_miniasic17_wd/pulpissimo-caninos/sim/../rtl/tb/tb_pulp.sv(857)
#    Time: 15302201 ns  Iteration: 0  Instance: /tb_pulp
# Break at /home/ivan.hirata/cadence_wd/616/tsmc18_miniasic17_wd/pulpissimo-caninos/sim/../rtl/tb/tb_pulp.sv line 857

And here is the c code of the test:
Code:
/*
* This example shows how to block the core until a GPIO
* value has changed.
*/

#include <stdio.h>
#include <rt/rt_api.h>
#include <stdint.h>

#if PULP_CHIP == CHIP_GAP
#define GPIO 0
#else
#define GPIO 13
#endif

#define NB_EDGE 10

static int edges = 0;

static void gpio_handler(void *arg)
{
 printf("Got edge.\n");
 edges++;
}

// Testing one GPIO PAD
/*
int main()
{
 if (rt_event_alloc(NULL, 1)) return -1;

 // GPIO initialization
 rt_gpio_init(0, GPIO);
 rt_pad_set_function(GPIO, 1); //pad_func=1 means gpio functionality. pad_func=0 is default

 // Configure GPIO as an inpout
 rt_gpio_set_dir(0, 1<<GPIO, RT_GPIO_IS_IN);

 // Trigger notifications on both rising and falling edges
 rt_gpio_set_sensitivity(0, GPIO, RT_GPIO_SENSITIVITY_EDGE);

 // Set the event for the GPIO.
 // Note that we use an IRQ event instead of a normal one so that
 // the callback is called directly from the IRQ handler.
 rt_gpio_set_event(0, GPIO, rt_event_irq_get(gpio_handler, (void *)GPIO));

 // Now wait for a few edges and see how long it takes
 unsigned long long start = rt_time_get_us();

 while(edges < NB_EDGE)
 {
   rt_event_yield(NULL);
 }

 unsigned long long end = rt_time_get_us();
 
 printf("Got %d edges in %d us\n", NB_EDGE, end - start);

 return 0;
}*/

// Testing all GPIO PADs
int main()
{
 if (rt_event_alloc(NULL, 1)) return -1;

 // GPIO initialization
 for (int i=0; i<32; i++)
 {
   rt_gpio_init(0, i);
   rt_pad_set_function(i, 1); //pad_func=1 means gpio functionality. pad_func=0 is default
 }

 // Configure GPIO as an inpout
 rt_gpio_set_dir(0, 0xffffffff, RT_GPIO_IS_IN);

 // Trigger notifications on both rising and falling edges
 for (int i=0; i<32; i++)
 {
   rt_gpio_set_sensitivity(0, i, RT_GPIO_SENSITIVITY_RISE);
 }

 // Set the event for the GPIO.
 // Note that we use an IRQ event instead of a normal one so that
 // the callback is called directly from the IRQ handler.
 for (int i=0; i<32; i++)
 {
   rt_gpio_set_event(0, i, rt_event_irq_get(gpio_handler, (void *)i));
   while(edges == 0)
   {
     rt_event_yield(NULL);
   }
   rt_gpio_set_event(0, i, NULL);
   edges = 0;
 }

 return 0;
}


The only thing I did before "run 13ms" is forcing all PADs to 0. And I verified that the problem is not in the pad_spim_sdio2, I tried starting with GPIO 2 then it failed at GPIO 4. 

Thanks in advance.