buglwIP - A Lightweight TCP/IP stack - Bugs: bug #50698, Need separate sys_arch functions...

 
 

You are not allowed to post comments on this tracker with your current authentication level.

bug #50698: Need separate sys_arch functions for interrupt context

Submitter:  Daniel Elstner <danielk>
Submitted:  Sat 01 Apr 2017 07:28:36 PM UTC
   
 
Category:  Platform ports Severity:  1 - Wish
Item Group:  Feature Request Status:  Fixed
Privacy:  Public Assigned to:  goldsimon
Open/Closed:  Closed Planned Release:  None
lwIP version:  git head

Jump to the original submission

Fri 05 Jan 2018 08:10:44 PM UTC, comment #6: 


> Any idea of how you would propagate the "BaseType_t *pxHigherPriorityTaskWoken" to the original ISR


I've decided to let the port handle this via the sys_mbox_trypost_fromisr() return value (which e.g. can be positive when scheduling is needed - normally all errors are negative).

I've pushed the lwIP core change for this and will be pushing an adaption for contrib soon.

Simon Goldschmidt <goldsimon>
Group administrator
Thu 04 Jan 2018 04:45:06 PM UTC, comment #5: 

Any idea of how you would propagate the "BaseType_t *pxHigherPriorityTaskWoken" to the original ISR? For Cortex ports, we could invoke the scheduler directly, but not for a generic FreeRTOS port...

Simon Goldschmidt <goldsimon>
Group administrator
Thu 04 Jan 2018 06:57:17 AM UTC, comment #4: 

OK, reopened :-)

That solution is indeed good to save an RX task. I wasn't aware of the stupid naming of this function though (tcpip_try_callback vs tcpip_trycallback, not the missing '_') and thought that it could not work because tcpip_try_callback() calls memp_malloc()...

Maybe we should change the name of tcpip_trycallback().

Simon Goldschmidt <goldsimon>
Group administrator
Thu 04 Jan 2018 06:49:06 AM UTC, comment #3: 

Well, my initial minimal proposal was to only add a new tcpip_trycallback_from_isr() API function, which would not require the pbuf alloc if I remember things correctly.

Daniel Elstner <danielk>
Thu 04 Jan 2018 06:41:29 AM UTC, comment #2: 

Daniel, looking at this again I don't think it will work to adapt sys_arch to FreeRTOS:
- all code sections calling SYS_ARCH_PROTECT() would have to know if they are in interrupt or not (at least the Cortex ports check that taskENTER_CRITICAL() is not called from an ISR), and this is done from pbuf_alloc(), not only for "free from other context"
- functions that call "fromISR" code would have to return the bool that indicates if scheduling is required

I guess I'll implement an optional mechanism that keeps a global counter "inISR" instead...

Simon Goldschmidt <goldsimon>
Group administrator
Wed 05 Apr 2017 07:22:09 PM UTC, comment #1: 

I'm aware of that freaky interrupt context interface FreeRTOS has. I don't know of any other OS doing it like that and honestly can't follow the argumentation of people telling me that doing it the FreeRTOS way is a performance improvement.

I do use FreeRTOS and like you, I don't need a change in lwIP (although it's fixed in a different way, not using DSRs, at least not on all platforms).

Nevertheless, since FreeRTOS seems to be often bundled with lwIP, I'm open for suggestions here.

Simon Goldschmidt <goldsimon>
Group administrator
Sat 01 Apr 2017 07:28:36 PM UTC, original submission:  

Depending on the configuration, lwIP allows some operations to be executed from interrupt context. E.g. the static callback mechanism is intended to allow posting messages to the TCP/IP thread via tcpip_trycallback() directly from an interrupt handler.

However, I noticed that tcpip_trycallback() calls into the same sys_arch function -- sys_mbox_trypost() -- as tcpip_callback_with_block() does. Unfortunately, this makes it impossible to use this feature on systems which have separate API calls for user context and interrupt context, such as FreeRTOS.

Thus I think the sys_arch API needs to be extended with a new function, say sys_mbox_trypost_from_isr(). It would be optional and simply alias to sys_mbox_trypost() by default. On the public API side, a corresponding tcpip_trycallback_from_isr() would need to be added. Alternatively, tcpip_trycallback() could be changed to use the new function and documented as being callable from interrupt context only.

In order to support LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT, there would also have to be separate versions of SYS_ARCH_(UN)PROTECT for use from interrupt context, as some FreeRTOS ports also require different calls for these. This would in turn also require separate ISR variants of memp_free() and pbuf_free(), so it may not be worth the effort.

Caveat: In my own design I delegate most interrupt work to high-priority threads which then in turn post messages to the lwIP thread. So I personally don't have any immediate need for this, and wouldn't be eating my own dog food if I contribute a patch.

Daniel Elstner <danielk>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by goldsimon (Posted a comment)
  • -email is unavailable- added by danielk (Submitted the item)
  •  

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

     

    Follow 8 latest changes.

    Date Changed by Updated Field Previous Value => Replaced by
    2018-01-05 goldsimon StatusIn Progress Fixed
        Open/ClosedOpen Closed
    2018-01-04 goldsimon StatusWont Fix In Progress
        Open/ClosedClosed Open
    2018-01-04 goldsimon StatusNone Wont Fix
        Assigned toNone goldsimon
        Open/ClosedOpen Closed
    2017-04-05 goldsimon Severity3 - Normal 1 - Wish

    Back to the top

    Powered by Savane 3.13-758e.
    Corresponding source code