Sony's Developer World forum

    • Home
    • Forum guidelines

    Upcoming maintenance 

     

    Dear Customers and Partners.

    This website will be undergoing scheduled maintenance on June 14, 2023. Please be aware there may be disruption to the developer portal website and associated services during the scheduled maintenance period.

    This upgrade is essential to ensure the continued performance, reliability, and security of Developer World.

    We apologize for any inconvenience.

     

     

    Fast I/O in Arduino IDE and external class

    Spresense
    2
    15
    1211
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      KamilTomaszewski DeveloperWorld @MezmerizeR last edited by

      @mezmerizer

      In the Arduino IDE go to Tools -> Board: "Spresense" -> Boards Manager... Look for "Spresense" and click the update button.

      Best Regards,
      Kamil Tomaszewski

      MezmerizeR 1 Reply Last reply Reply Quote
      • MezmerizeR
        MezmerizeR @KamilTomaszewski last edited by

        Hey @kamiltomaszewski,

        I'll give it a try on monday!

        Best,
        MezmerizeR

        1 Reply Last reply Reply Quote
        • MezmerizeR
          MezmerizeR last edited by

          Hey @KamilTomaszewski,

          this is the code I'm using right now. Actually just the code from the docs.

          volatile uint8_t *port = portOutputRegister(digitalPinToPort(3));
          void setup() {
          pinMode(3, OUTPUT);
          }
          
          void loop() {
          *port = 1; /* High */
          *port = 0; /* Low  */
          }
          

          It has no compile or linker errors but it has also no effect. So my pin 3 on the extension board is doing nothing. If I use digitalWrite it still works as expected.

          Best,
          MezmerizeR

          K 1 Reply Last reply Reply Quote
          • K
            KamilTomaszewski DeveloperWorld @MezmerizeR last edited by

            Hi @MezmerizeR I found what causes this issue. It will be fixed. Currently, please try the code below:

            volatile uint32_t *port = (volatile uint32_t *)portOutputRegister(digitalPinToPort(3));
            void setup() {
            pinMode(3, OUTPUT);
            }
            
            void loop() {
            *port = 1; /* High */
            *port = 0; /* Low  */
            }
            

            Please use uint32_t * instead of uint8_t * for this function.

            Best Regards,
            Kamil Tomaszewski

            MezmerizeR 1 Reply Last reply Reply Quote
            • MezmerizeR
              MezmerizeR @KamilTomaszewski last edited by

              Hey @KamilTomaszewski,

              works like a charm. Thank you!

              Best,
              MezmerizeR

              1 Reply Last reply Reply Quote
              • MezmerizeR
                MezmerizeR last edited by

                Hey again,

                the following code makes a difference in HIGH and LOW times of the pulse.

                #include <MP.h>
                
                #ifdef SUBCORE
                  #if (SUBCORE == 1)
                    uint8_t pinNo = 3;
                    volatile uint32_t *port = (volatile uint32_t *)portOutputRegister(digitalPinToPort(pinNo));
                    #define CORENO 1
                  #endif
                  #if (SUBCORE == 2)
                    uint8_t pinNo = 4;
                    volatile uint32_t *port = (volatile uint32_t *)portOutputRegister(digitalPinToPort(pinNo));
                    #define CORENO 2
                  #endif
                  #if (SUBCORE == 3)
                    uint8_t pinNo = 5;
                    volatile uint32_t *port = (volatile uint32_t *)portOutputRegister(digitalPinToPort(pinNo));
                    #define CORENO 3
                  #endif
                  #if (SUBCORE == 4)
                    uint8_t pinNo = 6;
                    volatile uint32_t *port = (volatile uint32_t *)portOutputRegister(digitalPinToPort(pinNo));
                    #define CORENO 4
                  #endif
                
                void setup() {
                  pinMode(pinNo, OUTPUT);
                  MP.begin();
                }
                
                void loop() {
                  while(1){
                    *port = 1; /* High */
                    *port = 0; /* Low  */
                  }
                }
                
                #else
                
                void setup() {
                  MP.begin(1);  // use only this -> ~760 ns
                //  MP.begin(2); // additional 760 ns -> ~1520 ns
                //  MP.begin(3); // ...
                //  MP.begin(4); // ... more than 3 µs
                }
                
                void loop() {
                }
                #endif
                

                The problem is when using multi-core programming. WITHOUT using the code on multiple cores, the pulses are about 760 ns. WITH multiple cores the pulses are X*760 ns, where X is the number of cores that I'm using. Is there a way (except maybe assembler code) to get it faster when I use multi-core programming? Or is this a limitation due to sequential commands of the CPU or something like this?

                Thanks,
                MezmerizeR

                K 1 Reply Last reply Reply Quote
                • K
                  KamilTomaszewski DeveloperWorld @MezmerizeR last edited by

                  @mezmerizer Don't you measure the time the MP.begin() function takes to execute? I mean you mainly consider the time the main core needs to initialize the sub cores.

                  Best Regards,
                  Kamil Tomaszewski

                  MezmerizeR 1 Reply Last reply Reply Quote
                  • MezmerizeR
                    MezmerizeR @KamilTomaszewski last edited by

                    Hey @kamiltomaszewski,

                    I'm measuring the signals on the pins (3,4,5,6 in that case), that are produced by the different subcores with an oscilloscope.

                    Best,
                    MezmerizeR

                    K 1 Reply Last reply Reply Quote
                    • K
                      KamilTomaszewski DeveloperWorld @MezmerizeR last edited by

                      @mezmerizer I checked it and it is unfortunately a limitation due to the bus architecture. The bus I/O access is serialized and cannot be multiplexed.

                      Best Regards,
                      Kamil Tomaszewski

                      MezmerizeR 1 Reply Last reply Reply Quote
                      • MezmerizeR
                        MezmerizeR @KamilTomaszewski last edited by

                        Hey @KamilTomaszewski ,

                        ok, good to know. Thank you for your support!

                        Best regards,
                        MezmerizeR

                        1 Reply Last reply Reply Quote
                        • First post
                          Last post
                        Developer World
                        Copyright © 2021 Sony Group Corporation. All rights reserved.
                        • Contact us
                        • Legal