Hi,
I use the init functions found in porting/nimble and
porting/npl/freertos. There are functions to handle semaphores,
queues,
timers,... Is there any issue with this freertos port, if it's not
official? I did not write any code related to the radio or irq as it
seems to be handled by these functions.
Here is the function I call in my main() to init nimble:
void nimble_port_init(void) {
void os_msys_init(void);
void ble_store_ram_init(void);
ble_npl_eventq_init(&g_eventq_dflt);
os_msys_init();
ble_hs_init();
ble_store_ram_init();
int res;
res = hal_timer_init(5, NULL);
ASSERT(res == 0);
res = os_cputime_init(32768);
ASSERT(res == 0);
ble_ll_init();
ble_hci_ram_init();
nimble_port_freertos_init(BleHost);
}
And BleHost():
void BleHost(void *) {
struct ble_npl_event *ev;
while (1) {
ev = ble_npl_eventq_get(&g_eventq_dflt, BLE_NPL_TIME_FOREVER);
ble_npl_event_run(ev);
}
}
If you want to have a look at the complete code, it's hosted on
Github.
main() is in src/main.cpp, the nimble is in src/libs/mynewt-nimble :
https://github.com/JF002/Pinetime
Is there anything specific I should check?
Thanks,
JF
Le 17/06/2020 10:35, Andrzej Kaczmarek a écrit :
> Hi,
>
> How did you setup interrupts on FreeRTOS (e.g. radio) and critical
> section?
> These kinds of problems are common if you have misconfigured locking,
> interrupt priorities or smth. Since we do not have any official port
> for
> FreeRTOS (there's only NPL but it does not deal with hardware) I assume
> you
> did this on your own so would be good to know more details.
>
> Best,
> Andrzej
>
>
> On Tue, Jun 16, 2020 at 8:29 PM <j...@codingfield.com> wrote:
>
>> Hi,
>>
>> I was able to do more tests using BLE_MONITOR_RTT and btmon.
>> Here are 3 captures from 2 phones (nexus 5 and huawei). The one from
>> the
>> Nexus contains 3 successful connections followed by a failed one. Both
>> from nexus only contain 1 failed attempt. For each test, you'll find
>> the
>> output of btmon and the capture from wireshark.
>> The files are available here :
>> https://seafile.codingfield.com/d/3e17cb3f43da4eedaefd/
>>
>> Note that I observed that the connection is more often successful when
>> BLE_MONITOR_RTT is enabled than when it is disabled. Remember it was
>> the
>> same with Debug/Release : there are more successful connections in
>> Debug
>> than in Release.
>> It makes me think of a timing issue, but it's weird that it works
>> better
>> when the code is supposed to run slower...
>>
>> I hope you'll be able to make sense of these captures!
>>
>> Thanks for your help!
>>
>> JF
>>
>>
>> Le 15/06/2020 22:54, j...@codingfield.com a écrit :
>> > Hi,
>> >
>> > Sorry, I do not mean to spam this mailing list. I just wanted to say I
>> > misread the article, and manage to use the monitor over RTT. I build
>> > the tool rtt2pty, ran it and then launched "btmon -J nrf52" and I see
>> > very detailed logs about BLE communication!
>> >
>> > It's running late, I'll analyze them tomorrow evening.
>> >
>> > Thanks for your help, and sorry for the spam :)
>> >
>> > JF
>> >
>> > Le 15/06/2020 22:25, j...@codingfield.com a écrit :
>> >> Hi again,
>> >>
>> >> Ok, I had a look to BLE_MONITOR_RTT, but I can't figure out how to
>> >> enable it in my code (which does not use mynewt as RTOS) : at first,
>> >> the code did not compile. I tried to fix the compilation errors (for
>> >> example, I had to define struct File_methods and struct File).
>> >> Then, I built the code, but couldn't see any messages coming out of
>> >> JLinkRTTClient.
>> >>
>> >> It is supposed to work with JLinkRTTClient, or do I need to use
>> >> btshell running on another nrf board? (I do not have a nrf52840 on
>> >> hands...).
>> >>
>> >> By the way, I already use the RTT for logging, and manage to enable
>> >> some loggers some nimble. Are the same messages available using the
>> >> logger, or do I really need bt_monitor?
>> >>
>> >> Thx!
>> >>
>> >> JF
>> >>
>> >> Le 15/06/2020 20:38, j...@codingfield.com a écrit :
>> >>> Hi,
>> >>>
>> >>> The ACK you're talking about, are they the "Rcvd Read" listed in the
>> >>> capture?
>> >>>
>> >>> If BLE_MONITOR_RTT means that nimble supports JLink RTT, then yes, I
>> >>> have a console available. I'll try to enable it. I'll also have a
>> >>> look
>> >>> at the stats and how to use them.
>> >>>
>> >>> Thanks for the pointers, I'll report to you as soon as I have more
>> >>> information!
>> >>>
>> >>> JF
>> >>>
>> >>> Le 14/06/2020 23:18, Łukasz Rymanowski a écrit :
>> >>>> Hi,
>> >>>>
>> >>>> so indeed your logs show that after trying to read include services
>> >>>> from
>> >>>> GATT service, something bad happened. Controller was able to ACK 2
>> >>>> following master packets then it stopped to send ACKs.
>> >>>> Do you have a console available? If so, does it show anything
>> >>>> interesting?
>> >>>>
>> >>>> For further debugging I suggest to look at BLE_MONITOR_RTT to grab
>> >>>> hci logs
>> >>>> (https://www.codecoup.pl/blog/support-for-btmon-in-mynewt/)
>> >>>> With this we will know if response is still in the host or is in
the
>> >>>> controller.
>> >>>>
>> >>>> Then we could check some stats e.g. ble_ll_stats - maybe that could
>> >>>> show us
>> >>>> something interesting - but first let us see where it stuck.
>> >>>>
>> >>>> Best
>> >>>> Łukasz
>> >>>>
>> >>>> On Sun, 14 Jun 2020 at 21:06, <j...@codingfield.com> wrote:
>> >>>>
>> >>>>> Hi,
>> >>>>>
>> >>>>> It looks like the attachements were dropped somewhere... You can
>> >>>>> download them on my seafile instance :
>> >>>>> https://seafile.codingfield.com/d/64d53a6ca6b44ae6b5d7/
>> >>>>>
>> >>>>> It seems to fail during the discovery of the characteristics on
the
>> >>>>> device. From what I understand, it happens during the discovery of
>> >>>>> Generic Access Profile and Generic Attributes Profile, which are
>> >>>>> handled
>> >>>>> by nimble.
>> >>>>> I may be wrong, I'm a beginner with BLE and nimble!
>> >>>>> Maybe the captures will make more sens to you?
>> >>>>>
>> >>>>> Yeah, it's very strange that it works when the code is supposed to
>> >>>>> run
>> >>>>> slower... It makes me think of a timing or memory issue, but I
>> >>>>> couldn't
>> >>>>> find it...
>> >>>>>
>> >>>>> Thanks,
>> >>>>> JF
>> >>>>>
>> >>>>> Le 14/06/2020 20:46, Łukasz Rymanowski a écrit :
>> >>>>> > Hi,
>> >>>>> >
>> >>>>> > Thanks for the report, however looks like attachments are
missing.
>> >>>>> >
>> >>>>> > First of all you need to understand what read fails i.e check
>> handle
>> >>>>> > and
>> >>>>> > make sure that your application responds correctly.
>> >>>>> > It is very suspicious that read works with -Og, but still I
would
>> focus
>> >>>>> > on
>> >>>>> > that failing read first.
>> >>>>> >
>> >>>>> > Thanks
>> >>>>> > Lukasz
>> >>>>> >
>> >>>>> >
>> >>>>> > On Sun, Jun 14, 2020, 20:25 <j...@codingfield.com> wrote:
>> >>>>> >
>> >>>>> >> Hello,
>> >>>>> >>
>> >>>>> >> I'm working on a firmware for the Pinetime, a smartwatch based
on
>> the
>> >>>>> >> NRF52832. The code is written in C/C++ and uses FreeRTOS.
>> >>>>> >> I've recently switched from the Nordic Softdevice to NimBLE as
BLE
>> >>>>> >> stack. I used the freertos port from the 'porting' folder of
the
>> >>>>> >> source
>> >>>>> >> code of nimble.
>> >>>>> >>
>> >>>>> >> I did many test using my PC on Linux : it can connect and
>> communicate
>> >>>>> >> with the NRF52 without issue.
>> >>>>> >> However, things are not that easy when I try to connect using
>> Android
>> >>>>> >> phone (I tried with a Huawei Psomething and my old Nexus5) :
the
>> >>>>> >> connection fails most of the time.
>> >>>>> >>
>> >>>>> >> I did a lot of debugging, logging, sniffing,.. and I still
cannot
>> >>>>> >> understand why it's not working as expected. Here are some of
my
>> >>>>> >> observations:
>> >>>>> >>
>> >>>>> >> - When Android successfully connects, I receive the following
>> GAP
>> >>>>> >> events : BLE_GAP_EVENT_CONNECT and then
BLE_GAP_EVENT_CONN_UPDATE
>> 2
>> >>>>> >> times. The first update sets the connection interval to 6, the
>> second
>> >>>>> >> one to 40.
>> >>>>> >> - When it fails, I receive only the BLE_GAP_EVENT_CONNECT
event
>> and
>> >>>>> >> the
>> >>>>> >> 1st BLE_GAP_EVENT_CONN_UPDATE.
>> >>>>> >> - Using the sniffer, I noticed that the last packet is a read
>> >>>>> >> request
>> >>>>> >> from the phone. It looks like the NRF52 never respond to this
last
>> >>>>> >> read.
>> >>>>> >> - It fails in the discovery steps (when the android phone
>> discover
>> >>>>> >> all
>> >>>>> >> the services, characteristics and attributes) but not always at
>> the
>> >>>>> >> same
>> >>>>> >> place.
>> >>>>> >> - I noticed that the tasks (ll task and host task are not in
>> >>>>> >> deadlock
>> >>>>> >> BUT it looks like the radio ISR (ble_phy_isr() in ble_phy.c) is
>> not
>> >>>>> >> called anymore.
>> >>>>> >> - When I build the very same code in DEBUG (-Og instead of
>> -O3), it
>> >>>>> >> works perfectly!
>> >>>>> >>
>> >>>>> >> You'll find in attachements 2 captures I did with Wireshark and
>> the
>> >>>>> >> NRF
>> >>>>> >> Sniffer (running on a NRF52-DK), one failed and one successful
>> attempt
>> >>>>> >> to connect.
>> >>>>> >>
>> >>>>> >> I'm running out of idea to debug this further. Is there a
>> >>>>> >> configuration
>> >>>>> >> issue (there are so many parameters in syscfg.h)? What could I
>> try?
>> >>>>> >> Where should I search ? Do you need more info to understand
the
>> >>>>> >> issue?
>> >>>>> >>
>> >>>>> >> Could you help me fix this issue?
>> >>>>> >>
>> >>>>> >> Thanks,
>> >>>>> >>
>> >>>>> >> JF
>> >>>>>
>>