Greetings

*I am seriously not an expert in this area but are you not asking for your
> operating system to be an RTOS (Real Time Operating System) when you expect
> it to input values from sensors when you are calculating through previous
> inputs?*
>
*My understanding is that a RTOS handles interrupts differently than
something like Debian.*

*It may be possible to get Debian to become more like an RTOS - - - if so,
how is that done?*

*(I'm looking at the BBB for process control and automation myself!)*

*Dee*


This person is actually talking about the PRUs ( Programmable Real-time
Units ), which can operate independent of the main processor, and host OS.
http://elinux.org/BeagleBone_PRU_Notes

To answer your question though( to the best of my ability ) I believe there
is a kernel config option to make the kernel operate more like real time
Linux.https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO

However that is "soft" real-time, and from what I understand is not exactly
reliable / stable for this hardware.

On Mon, Jan 12, 2015 at 5:21 AM, o1bigtenor <[email protected]> wrote:

> Greetings
>
> I am seriously not an expert in this area but are you not asking for your
> operating system to be an RTOS (Real Time Operating System) when you expect
> it to input values from sensors when you are calculating through previous
> inputs?
> My understanding is that a RTOS handles interrupts differently than
> something like Debian.
> It may be possible to get Debian to become more like an RTOS - - - if so,
> how is that done?
>
> (I'm looking at the BBB for process control and automation myself!)
>
> Dee
>
> On Wed, Dec 31, 2014 at 2:03 AM, Karteek YV <[email protected]> wrote:
>
>> My objective is to poll sensor output using GPIO and process the data.
>> The CPU is missing some of the pulses from sensor while processing the
>> previous data. My idea is to use PRU to count the sensor pulses and provide
>> the counter value to CPU using shared memory. I am using C code for PRU
>> after installing ti-pru-cgt-installer, the PRU-C code has to write the
>> counter data at some memory location after each pulse from sensor so that
>> host C-prog will be able to read the data whenever it is free.
>>
>> Given below is a PRU-C code which generates a square wave and user-LED
>> blinking of 20 cycles
>>
>> #include <stdint.h>
>> #include <pru_cfg.h>
>> #include <gpio_v2.h>
>> #include <soc_AM335x.h>
>> #include <gpio_v2.c>
>>
>> #define PRU0_ARM_INTERRUPT 19  // Interrupt used for halt signal
>>
>>
>> #define GPIO1             (*(volatile unsigned long *)(0x4804c000))
>>     // The address of the GPIO1
>> #define GPIO_INSTANCE_ADDRESS0           (SOC_GPIO_0_REGS)
>> #define GPIO_INSTANCE_ADDRESS1           (SOC_GPIO_1_REGS)
>> #define GPIO_INSTANCE_ADDRESS2           (SOC_GPIO_2_REGS)
>> #define GPIO_INSTANCE_ADDRESS3           (SOC_GPIO_3_REGS)
>> #define SYSCFG (*(&C4+0x01))
>> int C4 __attribute__((cregister("CFG",near),peripheral));    //only
>> compatible with v1.1.0B1 +
>>                                 //add following lines to MEMORY{} in
>> lnk.cmd
>>                                 //PAGE 2:
>>                                 //    MEM : o = 0x00026000 l = 0x00002000
>> CREGISTER=4
>> volatile register uint32_t __R30;
>> volatile register uint32_t __R31;
>>
>> /* Mapping Constant table register to variable */
>> volatile pruCfg CT_CFG __attribute__((cregister("CFG", near),
>> peripheral));
>>
>>
>> void main(){
>>     volatile uint32_t gpio;
>>     int i=0,j=1;
>>
>>     /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
>>     CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
>>
>>     /*Intialise OCP Master port for accessing external memories*/
>>     SYSCFG&=0xFFFFFFEF;
>>
>>     /* Toggle GPO pins TODO: Figure out which to use */
>>     gpio = 1<<2; //p9_30
>>    // Just a test to show how you can use assembly instructions directly
>>    // subtract 1 from REG1
>>   /* __asm__ __volatile__
>>    (
>>       " SUB r1, r1, 1 \n"
>>    );*/
>>
>>     /* TODO: Create stop condition, else it will toggle indefinitely */
>>     while(j<20){
>>         //__R30 ^= gpio;
>>     __R30 = 0<<2;
>>     //GPIOPinWrite(GPIO_INSTANCE_ADDRESS3, 16, GPIO_PIN_LOW);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 21, GPIO_PIN_LOW);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 22, GPIO_PIN_LOW);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 23, GPIO_PIN_LOW);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 24, GPIO_PIN_LOW);
>>     i++;
>>
>>
>>
>>
>>         //GPIOPinWrite(GPIO_INSTANCE_ADDRESS, 16, GPIO_PIN_LOW);
>>         //__R30 = __R30 | 1<<2;
>>         //for(j=0;j<5000000;j++);
>>         //__delay_cycles(50000000);
>>         //GPIOPinWrite(GPIO_INSTANCE_ADDRESS, 16, GPIO_PIN_HIGH);
>>         //__R30 = __R30 & 0<<2;
>>         //for(j=0;j<5000000;j++);
>>         __delay_cycles(50000000);
>>         //__R30 ^= gpio;
>>     __R30 = 1<<2;
>>     //GPIOPinWrite(GPIO_INSTANCE_ADDRESS3, 16, GPIO_PIN_HIGH);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 21, GPIO_PIN_HIGH);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 22, GPIO_PIN_HIGH);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 23, GPIO_PIN_HIGH);
>>     GPIOPinWrite(GPIO_INSTANCE_ADDRESS1, 24, GPIO_PIN_HIGH);
>>     i++;
>>         __delay_cycles(50000000);
>>         j++;
>>     }
>>     // Signal the process has completed (this will wake up the loader to
>> tell it work is done)
>>     __R31 = (__R31 & ~0xff) | (PRU0_ARM_INTERRUPT+16);
>>     /* Halt the PRU core */
>>     __halt();
>> }
>>
>>
>> and the host C prog to load PRU code is as below
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>>
>> #include <prussdrv.h>
>> #include <pruss_intc_mapping.h>
>>
>> #define PRU_NUM         0
>> #define AM33XX
>>
>> int main (int argc, char **argv)
>> {
>>     unsigned int ret;
>>     tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA;
>>
>>     /* Initialize the PRU */
>>     prussdrv_init ();
>>
>>     /* Open PRU Interrupt */
>>     ret = prussdrv_open(PRU_EVTOUT_0);
>>     if (ret) {
>>         printf("prussdrv_open open failed\n");
>>         return (ret);
>>     }
>>
>>     /* Get the interrupt initialized */
>>     prussdrv_pruintc_init(&pruss_intc_initdata);
>>
>>     /* Execute example on PRU */
>>     prussdrv_exec_program (PRU_NUM, "./text.bin");
>>
>>     /* Wait until PRU0 has finished execution */
>>     prussdrv_pru_wait_event (PRU_EVTOUT_0);
>>     prussdrv_pru_clear_event (PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
>>
>>     /* Disable PRU and close memory mapping*/
>>     prussdrv_pru_disable (PRU_NUM);
>>     prussdrv_exit ();
>>
>>     return(0);
>> }
>>
>> The above codes are generating output and my aim is to write the counter
>> value stored in 'i' from PRU code to be available to host C code. Can
>> anyone please help me ?
>>
>> and one more doubt is the lines GPIOPinWrite(GPIO_INSTANCE_ADDRESS3, 16,
>> GPIO_PIN_HIGH); and GPIOPinWrite(GPIO_INSTANCE_ADDRESS3, 16, GPIO_PIN_LOW);
>> doesn't produce out put, I have tired all the four GPIO base addresses, but
>> in vain.
>>
>> --
>> For more options, visit http://beagleboard.org/discuss
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "BeagleBoard" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to