Never mind, I think I got it working.

The problem it seems is that the Array has to be a const or declared inside the 
method.

Even though the compiler doesn’t throw a warning / error, thats what it needs.

PS, doing a os_mbuf_clear_chain  and then doing os_mbuf_get is that an 
efficient way to do this ?

Thanks,
Aditya Xavier.

> On 03-Apr-2018, at 1:19 PM, Aditya Xavier <adityaxav...@me.com> wrote:
> 
> Hi Andrzej,
> 
> I have implemented the changes you suggested, however cbor_read_mbuf_attrs 
> causes a crash.
> 
> Side note, I don’t think, the problem has ever been regarding cbor decoding. 
> Rather its about cbor encoding, so am not sure how much cbor_read_mbuf_attrs 
> would help.
> 
> Also, no mater what method I use, am unable to get the cbor_int aray printed.
> 
> Thanks,
> Aditya Xavier.
> 
> <cwd_test_mynewt2.zip>
> 
>> On 03-Apr-2018, at 11:25 AM, Aditya Xavier <adityaxav...@me.com> wrote:
>> 
>> Thanks Andrzej,
>> 
>> Yeah I have made the changes to the app, to get it working ( Didn’t test the 
>> BLE message Truncation & MSYS issues yet).
>> 
>> Regarding your suggestion about using cbor_read_mbuf_attrs(), yes it does 
>> makes sense.
>> 
>> However, is there any way to use a mbuf as a scratchpad ? i.e. write 
>> something to it, erase it / overwrite on it, without re-initializing it ?
>> 
>> Because, even if am doing a os_mbuf_free / os_mbuf_free_chain, am still able 
>> to access the previous values.
>> 
>> Thanks,
>> Aditya Xavier.
>> 
>> 
>>> On 02-Apr-2018, at 11:34 PM, Andrzej Kaczmarek 
>>> <andrzej.kaczma...@codecoup.pl> wrote:
>>> 
>>> Hi Aditya,
>>> 
>>> On Sun, Apr 1, 2018 at 3:51 PM, Aditya Xavier <adityaxav...@me.com> wrote:
>>>> Hi Andrzej,
>>>> 
>>>> PFB my the test code, this is a torn down version of the code we were 
>>>> trying to do.
>>>> 
>>>> However it should be good enough for you to understand the objective and 
>>>> the issues at hand.
>>>> 
>>>> I did not personally try the code myself, I would be able to do so and let 
>>>> you know the same tomorrow.
>>> 
>>> I checked the code and there are some issues wrt to mbuf handling
>>> which can cause problems.
>>> 
>>> Firstly, I don't see where you actually initialize cbor_codex_mbuf
>>> with proper mbuf as you neither received it from somewhere or call
>>> os_msys_get()/os_mbuf_get() to get it from a pool.
>>> Calling net_buf_simple_init() does not work here since it only
>>> initializes existing mbuf and you probably should not use it at all
>>> unless you're using this code for mesh. In case of mesh you can get
>>> valid mbuf by using NET_BUF_SIMPLE(). I assume this looks a bit
>>> different in your app as this sample app will most likely crash during
>>> startup.
>>> 
>>> Secondly, this probably causes data truncation:
>>> cbor_decode_action((char *)cbor_codex_mbuf->om_data, 
>>> cbor_codex_mbuf->om_len);
>>> Basically this way you pass contents of first mbuf in chain to
>>> decoding function, not complete chain. Internally this calls
>>> cbor_read_flat_attrs() but when working with mbufs you should use
>>> cbor_read_mbuf_attrs() instead and pass mbuf instead of its data.
>>> 
>>>> Thanks,
>>>> Aditya Xavier.
>>> 
>>> Best,
>>> Andrzej
>>> 
>>>> 
>>>> 
>>>>> On 31-Mar-2018, at 3:06 PM, Andrzej Kaczmarek 
>>>>> <andrzej.kaczma...@codecoup.pl> wrote:
>>>>> 
>>>>> Hi Aditya,
>>>>> 
>>>>> On Sat, Mar 31, 2018 at 5:51 AM, Aditya Xavier <adityaxav...@me.com> 
>>>>> wrote:
>>>>>> Increasing MSYS_1_BLOCK_COUNT to 30 gets it to work, but if I increase 
>>>>>> it to 40 it doesn’t.
>>>>>> Block size being 110.
>>>>>> 
>>>>>> Any reasoning behind this pattern?
>>>>> 
>>>>> This is strange. Can you post some piece of code to show how you handle 
>>>>> this?
>>>>> 
>>>>>> Also what would is behaviour of os_mbuf_free? Do I need to re init it 
>>>>>> again?
>>>>> 
>>>>> Not sure what you mean by "reinit". Calling os_mbuf_free() releases
>>>>> mbuf back to pool and it should no longer be used. You should call
>>>>> os_mbuf_get() or os_msys_get() to get new mbuf from appropriate pool.
>>>>> Also, if your CBOR stream exceeds size of block then you will have
>>>>> chain of mbufs which should be freed using os_mbuf_free_chain()
>>>>> instead. Basically, if you're not sure whether your mbuf is just a
>>>>> single mbuf or chain of mbufs, you can always use os_mbuf_free_chain()
>>>>> instead of os_mbuf_free().
>>>>> 
>>>>>> Sent from my iPhone
>>>>>> 
>>>>>>> On 30-Mar-2018, at 1:58 AM, Christopher Collins <ch...@runtime.io> 
>>>>>>> wrote:
>>>>>>> 
>>>>>>>> On Thu, Mar 29, 2018 at 10:27:36PM +0530, Aditya Xavier wrote:
>>>>>>>> Thanks for the tip. Would try that too..
>>>>>>>> 
>>>>>>>> However, I have tried few variations to check the BLE side ( whether 
>>>>>>>> it was responsible for truncating )
>>>>>>>> 
>>>>>>>> 1. I am able to send the same message using encoding only.. i.e. if I 
>>>>>>>> trigger the same using a button to send over ble.
>>>>>>>> i.e. BLE Connection, Button -> Encoding -> BLE Output, works.
>>>>>>>> 
>>>>>>>> 2. The method which receives the char * data, itself receives a 
>>>>>>>> truncated value.
>>>>>>>> BLE Connection, BLE Incoming -> Decoding -> Encoding -> BLE Outgoing, 
>>>>>>>> does not work. Truncation.
>>>>>>>> 
>>>>>>>> 3. I am able to send the same message using encoding only.. i.e if I 
>>>>>>>> trigger only the encoding method after receiving a message over BLE.
>>>>>>>> i.e. BLE Connection, BLE Incoming -> Encoding -> BLE Outgoing, works.
>>>>>>>> 
>>>>>>>> This kinda makes me feel that it should be a memory issue when its BLE 
>>>>>>>> + Decoding + Encoding. With or without using mbuf / mbuf_pool
>>>>>>>> 
>>>>>>>> Let me know if you require to see the code, I can write another small 
>>>>>>>> test app for you.
>>>>>>> 
>>>>>>> I think I understand the sequences you described.  I'm afraid I don't
>>>>>>> have a good answer.
>>>>>>> 
>>>>>>> Are you checking the return code of the encoding function?  If the
>>>>>>> system is running out of mbufs during encoding, the function should
>>>>>>> return `CborErrorOutOfMemory`, and the mbuf chain will be partially
>>>>>>> filled.
>>>>>>> 
>>>>>>> If you are running in gdb, another way to check for mbuf exhaustion is:
>>>>>>> ```
>>>>>>> p os_msys_init_1_mempool
>>>>>>> ```
>>>>>>> 
>>>>>>> and look at the `mp_min_free` value.  If it is 0, that means the pool
>>>>>>> has been exhausted at some point, and it is likely that some allocations
>>>>>>> have failed.
>>>>>>> 
>>>>>>> You can also just try increasing the number of mbufs in the system:
>>>>>>> ```
>>>>>>> newt target amend <target-name> syscfg=MSYS_1_BLOCK_COUNT=16
>>>>>>> ```
>>>>>>> 
>>>>>>> (assuming you are currently using the default value of 12; adjust
>>>>>>> accordingly if not)
>>>>>>> 
>>>>>>> Chris
>>>> 
>>>> 
>> 
> 

Reply via email to