Oh, the reason why I removed the '\n' from the printf() format - I'm
forming JSON object out of the canbus data I'm getting. When using cat on
the shared memory file, I was noticing an extra curly brace '}' at the end
of the file, and have absolutely no idea where it's coming from :/

It's still there, but no idea where it's coming from. So now I'm using
memset() on the data buffer for the file( every write iteration - before
the write ) - Which I probably should have been doing all along. but . .
.*checks*

Ah! It's gone .  .

william@debian-can:~$ cat /dev/shm/acme
{ "t": "aos", "i": 1, "v": 237650, "a": 1690, "f": 5999 }

Yeah, those are fixed point float representations ;)

On Tue, Aug 25, 2015 at 5:27 PM, William Hermans <yyrk...@gmail.com> wrote:

> *When I use stdio like that, I disable stdio buffering with*
>>
>> *         setbuf(stdout, NULL);*
>>
>> * Optionally, fprintf(stderr, ...); is unbuffered as well.*
>>
>> * Regards,*
>> * Peter Hurley*
>
>
> Thanks Peter.
>
> I've actually seen that before, but have never used it in my own code.
> Ideally, neither of these processes will be using stdout when all is
> finished. Right now, I'm using just one printf() for a little feedback
> without having to actually go to the browser to see whats going on.
>
> On Tue, Aug 25, 2015 at 4:56 PM, Harvey White <ma...@dragonworks.info>
> wrote:
>
>> On Tue, 25 Aug 2015 16:27:28 -0700, you wrote:
>>
>> >>
>> >> *Then you're not getting to the printf.....*
>> >>
>> >> * Ok, one possibility is that the system calls are taking lots of
>> time.*
>> >> * Another possibility is that the wait time is giving you a problem.*
>> >>
>> >> * If you understand the mechanism of a semaphore, then you can
>> implement*
>> >> * your own in code.*
>> >>
>> >> * Not sure what's going on.*
>> >
>> >
>> >Yeah, thats why I put the printf() there to begin with. A quick way to
>> test
>> >where my code was "hanging". However, I did do some further testing, and
>> >found the stalling was actually std out flushing once every 5-10 seconds
>> or
>> >so ( printf() no "\n" ) at least one the IPC server side. libmongoose on
>> >the other hand does not seem to function correctly with the -pthread
>> linker
>> >option . . . so POSIX semaphores are out.
>> >
>> >I also suspect my previous data structure was malformed, hence why my
>> >binary access lock was not working before. However, this allowed me to
>> >rethink the program flow and switch to a binary access scheme versus a
>> >binary file lock scheme. Which I honestly prefer.
>> >
>> >Yeah it works great. Now.
>>
>> NOW is all that counts.   You learned stuff, I learned stuff. Someone
>> reading this will (I hope) learn stuff.
>>
>> All is good.
>>
>> Thanks
>>
>> Harvey
>>
>> >
>> >On Tue, Aug 25, 2015 at 4:03 PM, Harvey White <ma...@dragonworks.info>
>> >wrote:
>> >
>> >> On Tue, 25 Aug 2015 15:11:30 -0700, you wrote:
>> >>
>> >>
>> >> If it works, then you have the solution.
>> >>
>> >> Good.
>> >>
>> >> Harvey
>> >>
>> >> >Anyway, I refactored the code, and wound up removing *a lot* of dead
>> >> weight
>> >> >code after the refactor. Went from using a union + struct data type to
>> >> just
>> >> >using a struct.
>> >> >
>> >> >Then changed the way my old binary locking mechanism worked. From 0->
>> >> >unlocked / 1->locked to 0-> IPC server has access / 1-> IPC client has
>> >> >access. Which works out exactly how I'd prefer it to. e.g. procedural
>> /
>> >> >deterministic, and one process will wait on the other indefinitely.
>> Which
>> >> >is a deadlock, but only one process running means the data is either
>> old,
>> >> >or not needed anyway. But like so . .
>> >> >
>> >> >IPC server:
>> >> >
>> >> >while(1){
>> >> >        frame = ReadFrame(sock);
>> >> >        if(frame.can_dlc == FRAME_DLC)
>> >> >            stats = ProcessFastpacket(frame);
>> >> >
>> >> >        if(stats != NULL){
>> >> >
>> >> >*while(smd->file_lock != 0)                usleep(1000);*
>> >> >
>> >> >            WriteToShm(smd, stats);
>> >> >            *smd->file_lock = 1;*
>> >> >
>> >> >            stats = NULL;
>> >> >            printf("%s", ReadFromShm(smd));
>> >> >        }
>> >> >    }
>> >> >
>> >> >IPC client:
>> >> >
>> >> >while(1){
>> >> >                mg_poll_server(server, 100);
>> >> >
>> >> >
>> >> >*while(smd->file_lock != 1)                        usleep(1000);*
>> >> >
>> >> >                push_message(server, smd->data);
>> >> >                *smd->file_lock = 0;*
>> >> >        }
>> >> >
>> >> >I do not think it will get any faster, or simpler than this.
>> >> >
>> >> >On Tue, Aug 25, 2015 at 11:47 AM, William Hermans <yyrk...@gmail.com>
>> >> wrote:
>> >> >
>> >> >> Harvey,
>> >> >>
>> >> >> Yeah, wow semaphores will *not* work! heh.
>> >> >>
>> >> >> So using sem_wait() / sem_post() introduces incredibly long stalls.
>> Even
>> >> >> when using a single process. The webserver which uses libmongoose
>> wont
>> >> even
>> >> >> function. Hell I put a printf() in the front of my control loop, and
>> >> that
>> >> >> doesn't even work :/
>> >> >>
>> >> >> Going to do some more digging, and see if I can somehow make this
>> work.
>> >> >>
>> >> >> On Mon, Aug 24, 2015 at 6:32 PM, Harvey White <
>> ma...@dragonworks.info>
>> >> >> wrote:
>> >> >>
>> >> >>> On Mon, 24 Aug 2015 18:19:14 -0700, you wrote:
>> >> >>>
>> >> >>> >>
>> >> >>> >> *I know the feeling.*
>> >> >>> >>
>> >> >>> >> * Good luck and don't hesitate to ask for more help, or at least
>> >> >>> advice,*
>> >> >>> >> * for whatever I can do.  Linux I can't really talk about, the*
>> >> >>> >> * fundamentals I think I can.*
>> >> >>> >>
>> >> >>> >
>> >> >>> >I think Linux in this context was not so important. I mean it is /
>> >> was,
>> >> >>> but
>> >> >>> >I generally do ok with high level on topic discussions. So long
>> as I
>> >> know
>> >> >>> >what my options are, everything is good.
>> >> >>>
>> >> >>> It's more of a general operating system issue, and that is
>> fundamental
>> >> >>> knowledge.  Personally, I don't see a problem, but the list
>> moderators
>> >> >>> haven't seemed to have a problem either, so that's ok.
>> >> >>>
>> >> >>> >
>> >> >>> >*Ask either on the list or private email if you want.*
>> >> >>> >>
>> >> >>> >
>> >> >>> >I don't mind asking here if that is fine with everyone.
>> Technically, I
>> >> >>> felt
>> >> >>> >a little funny posting here, as it was semi off topic( in
>> relation to
>> >> the
>> >> >>> >beaglebone ), but maybe the discussion helps someone else too ? If
>> >> there
>> >> >>> is
>> >> >>> >a problem, then I have no issues moving to another forum.
>> >> >>>
>> >> >>> True, except it *is* to get the beaglebone working, and *is* an
>> issue
>> >> >>> that can bite people writing somewhat more complicated projects.
>> >> >>>
>> >> >>> I'd hope that it will help others, and for that matter, if someone
>> >> >>> disagrees with what I've said, I'd welcome the discussion.
>> >> >>>
>> >> >>> Hopefully, the concepts will help with the more complicated
>> projects
>> >> >>> using any sort of beagle....
>> >> >>>
>> >> >>> Harvey
>> >> >>>
>> >> >>> >
>> >> >>> >On Mon, Aug 24, 2015 at 6:00 PM, Harvey White <
>> ma...@dragonworks.info
>> >> >
>> >> >>> >wrote:
>> >> >>> >
>> >> >>> >> On Mon, 24 Aug 2015 17:40:33 -0700, you wrote:
>> >> >>> >>
>> >> >>> >> >Hey Harvey, and Walter
>> >> >>> >> >
>> >> >>> >> >Just kind of an update. Last night after our discussion I
>> found a
>> >> >>> really
>> >> >>> >> >good resource / discussion of what fork() is and the different
>> ways
>> >> >>> it can
>> >> >>> >> >be used. So with this information in mind along with our
>> discussion
>> >> >>> >> >yesterday it seems that what I want to do can indeed be done
>> >> without
>> >> >>> using
>> >> >>> >> >POSIX shared memory( I had little doubt ) - *and* seemingly
>> more
>> >> >>> simple.
>> >> >>> >>
>> >> >>> >> That sounds good
>> >> >>> >> >
>> >> >>> >> >I'd still have to use a Semaphore - I think to keep the web
>> server
>> >> >>> >> callback
>> >> >>> >> >from stalling my canbus routines. But I think that seems fairly
>> >> >>> >> reasonable.
>> >> >>> >> >
>> >> >>> >>
>> >> >>> >> That also sounds quite reasonable to do.  As your programs get
>> more
>> >> >>> >> complicated, you'll have to figure out how to
>> >> interlock/protect/manage
>> >> >>> >> resources.
>> >> >>> >>
>> >> >>> >> I have a project that manages a graphics engine (software), I2C
>> >> slave
>> >> >>> >> (ditto), heartbeat/errortask, I2C error reporting task, and the
>> >> like;
>> >> >>> >> and uses a FIFO, semaphores, queues and the like to protect
>> >> resources
>> >> >>> >> and manage memory.
>> >> >>> >>
>> >> >>> >> Probably a bit too complex, but it kinda grew that way.
>> >> >>> >>
>> >> >>> >>
>> >> >>> >> >Still I may just implement semaphores into my current code to
>> >> check it
>> >> >>> >> out,
>> >> >>> >> >but not sure when. Been a semi rough day, and I'm whooped . . .
>> >> >>> >>
>> >> >>> >> I know the feeling.
>> >> >>> >>
>> >> >>> >> Good luck and don't hesitate to ask for more help, or at least
>> >> advice,
>> >> >>> >> for whatever I can do.  Linux I can't really talk about, the
>> >> >>> >> fundamentals I think I can.
>> >> >>> >>
>> >> >>> >> Ask either on the list or private email if you want.
>> >> >>> >>
>> >> >>> >> Harvey
>> >> >>> >>
>> >> >>> >> >
>> >> >>> >> >On Sun, Aug 23, 2015 at 9:44 PM, William Hermans <
>> >> yyrk...@gmail.com>
>> >> >>> >> wrote:
>> >> >>> >> >
>> >> >>> >> >> OK have a good one, thanks for the discussion.
>> >> >>> >> >>
>> >> >>> >> >> On Sun, Aug 23, 2015 at 9:11 PM, Harvey White <
>> >> >>> ma...@dragonworks.info>
>> >> >>> >> >> wrote:
>> >> >>> >> >>
>> >> >>> >> >>> On Sun, 23 Aug 2015 20:18:26 -0700 (PDT), you wrote:
>> >> >>> >> >>>
>> >> >>> >> >>> >
>> >> >>> >> >>> >>
>> >> >>> >> >>> >> *Well, you're certainly right that the callback is
>> messing*
>> >> >>> >> >>> >> * things up.  If I assume the same callback, then the
>> >> callback
>> >> >>> is*
>> >> >>> >> >>> >> * certainly changing data.  If you can set the right
>> >> >>> breakpoint, you
>> >> >>> >> >>> can*
>> >> >>> >> >>> >> * tag the situation *if* the breakpoint also knows that
>> the
>> >> >>> process
>> >> >>> >> is*
>> >> >>> >> >>> >> * reading from the CAN bus.*
>> >> >>> >> >>> >>
>> >> >>> >> >>> >> * Had you considered disabling that callback function
>> until
>> >> the
>> >> >>> >> read*
>> >> >>> >> >>> >> * from the CANbus is finished?  Would it be practical?
>> >> That's
>> >> >>> where
>> >> >>> >> >>> the*
>> >> >>> >> >>> >> * semaphore might help a lot.*
>> >> >>> >> >>> >>
>> >> >>> >> >>> >> * what variables could be common between the two
>> routines?*
>> >> >>> >> >>> >>
>> >> >>> >> >>> >> * Harvey*
>> >> >>> >> >>> >>
>> >> >>> >> >>> >
>> >> >>> >> >>> >Well this is where previous experience fails me. I've
>> pretty
>> >> much
>> >> >>> >> avoided
>> >> >>> >> >>> >code related to threading in software. In the past. I do
>> know
>> >> of
>> >> >>> >> fork()
>> >> >>> >> >>> and
>> >> >>> >> >>> >roughly what it is capable of, and I know about threads,
>> but
>> >> not
>> >> >>> to
>> >> >>> >> >>> >implement them in C on Linux. Or what can be done with
>> them.
>> >> Lets
>> >> >>> talk
>> >> >>> >> >>> code
>> >> >>> >> >>> >a minute.
>> >> >>> >> >>>
>> >> >>> >> >>> OK, as well as I can follow it.
>> >> >>> >> >>>
>> >> >>> >> >>> >
>> >> >>> >> >>> >*IPC - Server - Reads from canbus*
>> >> >>> >> >>> >int main(){
>> >> >>> >> >>> >    struct can_frame frame;
>> >> >>> >> >>> >    int sock = InitializeCAN("vcan0");
>> >> >>> >> >>> >
>> >> >>> >> >>> >    statistics_t *stats = NULL;
>> >> >>> >> >>> >
>> >> >>> >> >>> >    const long shm_size = sysconf(_SC_PAGESIZE);
>> >> >>> >> >>> >
>> >> >>> >> >>> >    int shm_fd = shm_open("acme", O_CREAT | O_RDWR,
>> >> FILE_PERMS);
>> >> >>> >> >>>
>> >> >>> >> >>> **NOTE:  the problem may be "acme", since we know that acme
>> >> >>> products
>> >> >>> >> >>> are not effective against roadrunners.....
>> >> >>> >> >>>
>> >> >>> >> >>> >    if(shm_fd == -1)
>> >> >>> >> >>> >        HandleError(strerror(errno));
>> >> >>> >> >>> >
>> >> >>> >> >>> >    const int retval = ftruncate(shm_fd, shm_size);
>> >> >>> >> >>> >    if(retval == -1)
>> >> >>> >> >>> >        HandleError(strerror(errno));
>> >> >>> >> >>> >
>> >> >>> >> >>> >    shared_memory = InitializeShm(shm_size * sizeof(char),
>> >> >>> shm_fd);
>> >> >>> >> >>> >    close(shm_fd);
>> >> >>> >> >>> >
>> >> >>> >> >>> >    while(1){
>> >> >>> >> >>> >        frame = ReadFrame(sock);
>> >> >>> >> >>> >        if(frame.can_dlc == FRAME_DLC)
>> >> >>> >> >>> >            stats = ProcessFastpacket(frame);
>> >> >>> >> >>>
>> >> >>> >> >>> right at this point, you have no protection against access
>> and
>> >> no
>> >> >>> >> >>> interlocking.
>> >> >>> >> >>>
>> >> >>> >> >>> I'll have to give you pseudocode, because I don't know how
>> to do
>> >> >>> this
>> >> >>> >> >>> in Linux.
>> >> >>> >> >>>
>> >> >>> >> >>>         In the init routine, before you set up either main
>> as a
>> >> >>> >> >>> process (I assume you do this).  Declare a semaphore:
>> >> >>> >> >>>
>> >> >>> >> >>> semaphore_handle shared_access;                 // create
>> >> semaphore
>> >> >>> >> >>> handle accessible to both processes.
>> >> >>> >> >>> semaphore_create (shared_access);                       //
>> >> create
>> >> >>> >> >>> semaphore
>> >> >>> >> >>>
>> >> >>> >> >>>
>> >> >>> >> >>> then modify this next section to:
>> >> >>> >> >>>
>> >> >>> >> >>>         if(stats != NULL){
>> >> >>> >> >>>         if (semaphore_take(shared_access), <wait forever>)
>> >> >>> >> >>>         {
>> >> >>> >> >>>                         WriteToShm(shared_memory, stats);
>> >> >>> >> >>>                 semaphore_give (shared_access);
>> >> >>> >> >>>         }
>> >> >>> >> >>>         stats = NULL;
>> >> >>> >> >>>             printf("%s", ReadFromShm(shared_memory));
>> >> >>> >> >>>         }
>> >> >>> >> >>>        task_delay(n);
>> >> >>> >> >>>
>> >> >>> >> >>> NOTE:   Process A hangs until it can "get" the semaphore; if
>> >> >>> Process B
>> >> >>> >> >>> has it, B can keep it only long enough to send the packet
>> >> >>> >> >>> >
>> >> >>> >> >>> >        if(stats != NULL){
>> >> >>> >> >>> >            WriteToShm(shared_memory, stats);
>> >> >>> >> >>> >            stats = NULL;
>> >> >>> >> >>> >            printf("%s", ReadFromShm(shared_memory));
>> >> >>> >> >>> >        }
>> >> >>> >> >>> >    }
>> >> >>> >> >>> >}/* main() */
>> >> >>> >> >>> >
>> >> >>> >> >>> >
>> >> >>> >> >>> >
>> >> >>> >> >>> >*IPC - Client / webserver*
>> >> >>> >> >>> >
>> >> >>> >> >>> >int main(void) {
>> >> >>> >> >>> >        struct mg_server *server = mg_create_server(NULL,
>> >> >>> ev_handler);
>> >> >>> >> >>> >
>> >> >>> >> >>> >        mg_set_option(server, "listening_port", "8000");
>> >> >>> >> >>> >        mg_set_option(server, "document_root", "./web");
>> >> >>> >> >>> >
>> >> >>> >> >>> >        printf("Started on port %s\n",
>> mg_get_option(server,
>> >> >>> >> >>> >"listening_port"));
>> >> >>> >> >>> >
>> >> >>> >> >>> >        // POSIX IPC - shared memory
>> >> >>> >> >>> >        const long shm_size = sysconf(_SC_PAGESIZE);
>> >> >>> >> >>> >        int shm_fd = shm_open("file", O_CREAT | O_RDWR,
>> >> >>> FILE_PERMS);
>> >> >>> >> >>> >        if(shm_fd == -1)
>> >> >>> >> >>> >                HandleError(strerror(errno));
>> >> >>> >> >>> >
>> >> >>> >> >>> >        const int retval = ftruncate(shm_fd, shm_size);
>> >> >>> >> >>> >        if(retval == -1)
>> >> >>> >> >>> >                HandleError(strerror(errno));
>> >> >>> >> >>> >
>> >> >>> >> >>> >        shared_memory = InitializeShm(shm_size *
>> sizeof(char),
>> >> >>> >> shm_fd);
>> >> >>> >> >>> >
>> >> >>> >> >>> >        close(shm_fd);
>> >> >>> >> >>> >
>> >> >>> >> >>> >        char id = 0x00;
>> >> >>> >> >>> >        for (;;) {
>> >> >>> >> >>> >                mg_poll_server(server, 10);
>> >> >>> >> >>> >
>> >> >>> >> >>> then do the same here
>> >> >>> >> >>>
>> >> >>> >> >>>         if (semaphore_take(shared_access), <wait forever>)
>> >> >>> >> >>>         {
>> >> >>> >> >>>                         if(shared_memory->sdata.data[19] !=
>> id){
>> >> >>> >> >>>  push_message(server,shared_memory->sdata.data);
>> >> >>> >> >>>                                         id =
>> >> >>> >> >>> shared_memory->sdata.data[19];
>> >> >>> >> >>>                         }
>> >> >>> >> >>>                 semaphore_give (shared_access);
>> >> >>> >> >>>         }
>> >> >>> >> >>>         task_delay (n clock ticks);
>> >> >>> >> >>>
>> >> >>> >> >>> semaphore_take gets the semaphore if and only if it's
>> available.
>> >> >>> It
>> >> >>> >> >>> does so in a thread safe manner.  the <wait_forever> is
>> whatever
>> >> >>> value
>> >> >>> >> >>> the system uses to tell the process to hang.  You don't
>> want the
>> >> >>> >> >>> process to wait and then just go.
>> >> >>> >> >>>
>> >> >>> >> >>> Because each example here releases the semaphore
>> >> (semaphore_give)
>> >> >>> if
>> >> >>> >> >>> and only if it could get it, and since giving and taking the
>> >> >>> semaphore
>> >> >>> >> >>> is thread safe, the two threads should be fine.
>> >> >>> >> >>>
>> >> >>> >> >>> So your "consumer" thread can't check for valid data until
>> >> there's
>> >> >>> >> >>> something there.   When it first starts up, it has to get
>> bad
>> >> >>> (null)
>> >> >>> >> >>> data and throw that away, since you can't guarantee that one
>> >> thread
>> >> >>> >> >>> starts before the other (unless you block the thread using a
>> >> >>> suspend,
>> >> >>> >> >>> but that's not really the best thing to do), so you have to
>> >> >>> consider
>> >> >>> >> >>> that you have two parallel and independent threads.
>> >> >>> >> >>>
>> >> >>> >> >>> The consumer thread can access shared memory only when it's
>> not
>> >> >>> been
>> >> >>> >> >>> actively written to.  It has to figure out if data is good
>> and
>> >> >>> what to
>> >> >>> >> >>> do with it.  However, once written, that data will remain
>> >> >>> uncorrupted
>> >> >>> >> >>> until the consumer has read and processed it (because the
>> >> consumer
>> >> >>> has
>> >> >>> >> >>> the semaphore and doesn't give it up until then).
>> >> >>> >> >>>
>> >> >>> >> >>> The producer thread checks to see if the data is there to
>> send,
>> >> >>> >> >>> accesses shared memory by getting the semaphore (when the
>> >> consumer
>> >> >>> is
>> >> >>> >> >>> not reading it), and then writes that shared memory.  It
>> then
>> >> >>> releases
>> >> >>> >> >>> the semaphore, goes idle (because the task switcher has to
>> have
>> >> a
>> >> >>> time
>> >> >>> >> >>> to start up the other task unless you have multiple cores),
>> and
>> >> >>> then
>> >> >>> >> >>> checks for data, and waits to see when it can write that
>> data.
>> >> >>> >> >>>
>> >> >>> >> >>> The typical task clock is either 1 ms or 10 ms, and the
>> clock
>> >> tick
>> >> >>> is
>> >> >>> >> >>> that (1 ms or 10 ms per tick).  You play with the values for
>> >> best
>> >> >>> >> >>> throughput on the n delays.
>> >> >>> >> >>>
>> >> >>> >> >>>
>> >> >>> >> >>> >                if(shared_memory->sdata.data[19] != id){
>> >> >>> >> >>> >                        push_message(server,
>> >> >>> >> shared_memory->sdata.data);
>> >> >>> >> >>> >                        id = shared_memory->sdata.data[19];
>> >> >>> >> >>> >                }
>> >> >>> >> >>> >        }
>> >> >>> >> >>> >
>> >> >>> >> >>> >        mg_destroy_server(&server);
>> >> >>> >> >>> >        return 0;
>> >> >>> >> >>> >}
>> >> >>> >> >>> >
>> >> >>> >> >>> >In the context of whats interesting where threading is
>> >> concerned.
>> >> >>> The
>> >> >>> >> >>> loops
>> >> >>> >> >>> >in each executable here might be useful. If somehow each,
>> or
>> >> even
>> >> >>> just
>> >> >>> >> >>> the
>> >> >>> >> >>> >for loop in the IPC client could somehow use objects in
>> memory
>> >> >>> from
>> >> >>> >> the
>> >> >>> >> >>> IPC
>> >> >>> >> >>> >server.
>> >> >>> >> >>>
>> >> >>> >> >>> That was the shared memory, right?
>> >> >>> >> >>>
>> >> >>> >> >>> >That is let us suppose for a minute IPC was removed
>> entirely,
>> >> then
>> >> >>> >> >>> >somehow I could turn off the callback in the IPC client.
>> This
>> >> is
>> >> >>> what
>> >> >>> >> I'm
>> >> >>> >> >>> >having a problem imagining. How could this be done ?
>> >> >>> >> >>>
>> >> >>> >> >>> You may possibly be able to schedule *when* the callback
>> >> happens.
>> >> >>> >> >>>
>> >> >>> >> >>> What causes the callback, sending a CAN message?
>> >> >>> >> >>>
>> >> >>> >> >>> > In the context of
>> >> >>> >> >>> >libmongoose I'm not sure. In the context of threading or
>> using
>> >> >>> fork()
>> >> >>> >> I'm
>> >> >>> >> >>> >also not sure.
>> >> >>> >> >>>
>> >> >>> >> >>> Fork creates a separate process which can be controlled or
>> >> killed
>> >> >>> as
>> >> >>> >> >>> needed, running as a sub-process (IIRC).
>> >> >>> >> >>>
>> >> >>> >> >>> you're dealing with creating two processes (really two
>> programs)
>> >> >>> and
>> >> >>> >> >>> interprocess communication.
>> >> >>> >> >>>
>> >> >>> >> >>> >But if I could somehow through using threading context to
>> >> >>> >> >>> >disable the callback I think that would be ideal. That way
>> I
>> >> could
>> >> >>> >> simply
>> >> >>> >> >>> >disable that whole thread for a fraction of a second, and
>> then
>> >> >>> resume
>> >> >>> >> it
>> >> >>> >> >>> >once a fastpacket is constructed.
>> >> >>> >> >>>
>> >> >>> >> >>>
>> >> >>> >> >>>
>> >> >>> >> >>> Well, synchronizing the two tasks with semaphores says that
>> if
>> >> the
>> >> >>> >> >>> callback happens and you can turn off that callback, then
>> the
>> >> data
>> >> >>> is
>> >> >>> >> >>> ok as long as you can schedule the callback.  No idea when
>> that
>> >> >>> >> >>> happens.
>> >> >>> >> >>>
>> >> >>> >> >>> So you maybe able to
>> >> >>> >> >>> 1) produce data
>> >> >>> >> >>> 2) keep from overwriting it
>> >> >>> >> >>> 3) enable the consumer to read data
>> >> >>> >> >>> 4) have it send data (and I assume the callback happens
>> here)
>> >> >>> >> >>> 5) data is clobbered in the shared area, but we don't care
>> since
>> >> >>> it's
>> >> >>> >> >>> sent already
>> >> >>> >> >>> 6) give the semaphore back allowing new data to be written
>> >> >>> >> >>> 7) that data can't be clobbered by the callback (assuming)
>> until
>> >> >>> after
>> >> >>> >> >>> it's read and in the send process
>> >> >>> >> >>>
>> >> >>> >> >>> May solve the problem...
>> >> >>> >> >>>
>> >> >>> >> >>>
>> >> >>> >> >>> >
>> >> >>> >> >>> >Anyway, a little information that might be needed.
>> socketCAN
>> >> reads
>> >> >>> >> data
>> >> >>> >> >>> in
>> >> >>> >> >>> >8 byte lengths for each frame..fastpackets are several
>> frames
>> >> in
>> >> >>> >> length,
>> >> >>> >> >>> >and with the only current one I'm tracking being 11 frames
>> >> long.
>> >> >>> Or 88
>> >> >>> >> >>> >total bytes, not discounting the initial char from each
>> frame
>> >> >>> which
>> >> >>> >> is a
>> >> >>> >> >>> >sequence number. If there is a way, and I'm sure there is,
>> I am
>> >> >>> all
>> >> >>> >> for
>> >> >>> >> >>> >changing from an IPC model to a threaded model. But I still
>> >> have
>> >> >>> some
>> >> >>> >> >>> >doubts. Such as will it be fast enough to track multiple
>> >> >>> fastpackets a
>> >> >>> >> >>> >second ? Past that how complex will it be ?
>> >> >>> >> >>>
>> >> >>> >> >>> Won't be all that complex, I think
>> >> >>> >> >>> the processes are written as two parts
>> >> >>> >> >>> one is a system call to set up a process
>> >> >>> >> >>> the other is the process itself which looks like
>> >> >>> >> >>>
>> >> >>> >> >>> void processA(void* arguments if any)
>> >> >>> >> >>> {
>> >> >>> >> >>>         //      declarations and inits the first time
>> through
>> >> >>> >> >>>         while (1)
>> >> >>> >> >>>         {
>> >> >>> >> >>>                 basic process loop;
>> >> >>> >> >>>         }
>> >> >>> >> >>> }
>> >> >>> >> >>>
>> >> >>> >> >>> not complicated at all, how to create the process ought to
>> be
>> >> well
>> >> >>> >> >>> documented
>> >> >>> >> >>>
>> >> >>> >> >>> you just need to make sure that the two processes have
>> access to
>> >> >>> >> >>> shared memory
>> >> >>> >> >>>
>> >> >>> >> >>> assuming 1000 us available per process, a context switching
>> time
>> >> >>> of 50
>> >> >>> >> >>> us (may be shorter, but it's a number)
>> >> >>> >> >>>
>> >> >>> >> >>> You have 950 us to send a complete message without it
>> having a
>> >> >>> delay
>> >> >>> >> >>> you have that same 950 us to detect and build a message.
>> >> >>> >> >>>
>> >> >>> >> >>> that gives you 500 message cycles/second
>> >> >>> >> >>>
>> >> >>> >> >>> taking twice as long gives you 250 message cycles/second and
>> >> about
>> >> >>> >> >>> 1950 us to compose and send a message, that's with a 2 ms
>> clock
>> >> >>> tick.
>> >> >>> >> >>> All that clock tick does is control task switching.  The
>> >> processor
>> >> >>> >> >>> clock controls the speed of operations otherwise.
>> >> >>> >> >>>
>> >> >>> >> >>> >
>> >> >>> >> >>> >I have given multiple approaches consideration, just
>> having a
>> >> hard
>> >> >>> >> time
>> >> >>> >> >>> >imaging how to work this out using a threading model.
>> >> >>> >> >>>
>> >> >>> >> >>> perhaps this might help
>> >> >>> >> >>>
>> >> >>> >> >>> Harvey
>> >> >>> >> >>>
>> >> >>> >> >>> (off to bed, have to be in training for 8 am classes in a
>> week).
>> >> >>> >> >>>
>> >> >>> >> >>> --
>> >> >>> >> >>> 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 beagleboard+unsubscr...@googlegroups.com.
>> >> >>> >> >>> 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 beagleboard+unsubscr...@googlegroups.com.
>> >> >>> >> 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 beagleboard+unsubscr...@googlegroups.com.
>> >> >>> 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 beagleboard+unsubscr...@googlegroups.com.
>> >> 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 beagleboard+unsubscr...@googlegroups.com.
>> 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 beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to