<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/125656/choice-of-controller-configurations-in-ble-throughput-sample</link><description>I am referring to the ncs\v3.1.0\nrf\samples\bluetooth\throughput\sysbuild\ipc_radio\prj.conf for the nRF5340 and extrapolating that to a central application with multiple peripheral connections. In that case, RAM use on the network core becomes a concern</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 27 Jan 2026 18:44:16 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/125656/choice-of-controller-configurations-in-ble-throughput-sample" /><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/559722?ContentTypeID=1</link><pubDate>Tue, 27 Jan 2026 18:44:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c77be8c0-e3ff-4972-ba6d-a26f297fc8e7</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;Hi &lt;a href="https://devzone.nordicsemi.com/members/brjohnson"&gt;brjohnson&lt;/a&gt;&amp;nbsp;&lt;br /&gt;You are correct that the controller returns &lt;span&gt;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT&amp;nbsp;&lt;/span&gt;&lt;span&gt;as the response to the host&amp;#39;s HCI LE Read Buffer Size command. I can see that myself via logging.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;But why do you say&amp;nbsp;&lt;/p&gt;
[quote userid="148378" url="~/f/nordic-q-a/125656/choice-of-controller-configurations-in-ble-throughput-sample/558736"]This obviously does not make sense as ACL_TX_COUNT refers to number of buffers shared among connections, whereas SDC_TX_PACKET_COUNT is specified as per connection.[/quote]
&lt;p&gt;By using the&amp;nbsp;&lt;span&gt;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT instead of&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT&amp;nbsp;in the reply, to me, the controller is telling the host it can accommodate&amp;nbsp;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT&amp;nbsp;no matter if there is one connection active or more than one connection active.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/558736?ContentTypeID=1</link><pubDate>Wed, 14 Jan 2026 20:16:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9ebd349a-3ef4-4985-891e-b0e9bcf33d50</guid><dc:creator>brjohnson</dc:creator><description>&lt;p&gt;Hello Amanda, I wanted to jump in here and ask for a little clarification on your statement about the Controller returning CONFIG_BT_BUF_ACL_TX_COUNT as the response to the HCI LE Read Buffer Size command.&lt;br /&gt;&lt;br /&gt;I am in the process of updating our nRF5340 application to NCS 3.2 and have been seeing the &amp;quot;&lt;span&gt;&amp;lt;wrn&amp;gt; bt_hci_core: Num of Controller&amp;#39;s ACL packets != ACL bt_conn_tx contexts (3 != 10)&amp;quot; log that is mentioned elsewhere in this thread. I have verified that both the application and ipc_radio configuration have CONFIG_BT_BUF_ACL_TX_COUNT set to 10, and yet I am still seeing this exact warning. I&amp;nbsp;suspect that&amp;nbsp;&lt;br /&gt;the controller is actually using CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT as when I set that to 10 in the ipc_radio config, the warning goes away. This obviously does not make sense as ACL_TX_COUNT refers to number of buffers shared among connections, whereas SDC_TX_PACKET_COUNT is specified as per connection.&lt;br /&gt;&lt;br /&gt;This can be easily recreated with the throughput sample&amp;nbsp;building for nrf5340dk/nrf5340/cpuapp. If you add the following to prj.conf in a clone of the throughput sample:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_LOG=y
CONFIG_BT_LOG_LEVEL_WRN=y&lt;/pre&gt;&lt;br /&gt;You will see the exact warning log mentioned above.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;You can then add&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT&lt;/span&gt;&lt;span&gt;=10&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;to sysbuild/ipc_radio/prj.conf and rerun the sample and observe that the warning has gone away. Would you be able to comment on this behavior?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557966?ContentTypeID=1</link><pubDate>Mon, 05 Jan 2026 21:57:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fa20ac31-7d34-43f6-b3bb-27c0b39e966a</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;Hi Amanda,&amp;nbsp;&lt;br /&gt;Happy New Year to you too.&lt;br /&gt;&lt;br /&gt;Your&amp;nbsp;above reply is exactly what I was looking for.&lt;br /&gt;&lt;br /&gt;This part of the reply was very telling:&lt;/p&gt;
[quote userid="77782" url="~/f/nordic-q-a/125656/choice-of-controller-configurations-in-ble-throughput-sample/557939"]No.&amp;nbsp;Making it bigger than 255 on the network core shouldn&amp;#39;t bring any benefit.[/quote]
&lt;p&gt;I assume 255 is the 251 plus 4 bytes for the MIC or the 4 bytes for the l2cap header.&lt;br /&gt;&lt;br /&gt;Anyway, I think it would be useful if this fact were documented somewhere, especially as a comment in the Throughput sample network core .conf file. In fact, the &lt;a href="https://github.com/nrfconnect/sdk-nrf/blob/v3.2.0/samples/bluetooth/throughput/sysbuild/ipc_radio/prj.conf#L22"&gt;Throughput sample&lt;/a&gt; sets the default value to 502 instead of 255 for the network core:&amp;nbsp;&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE=502.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Similarly, as I pointed out in an earlier reply, it would be nice if the Throughput sample&amp;nbsp;used a more reasonable&amp;nbsp;CONFIG_HEAP_MEM_POOL_SIZE instead of 8192 (see the same file I linked above).&amp;nbsp; As I said earlier, with multiple connection support, the network core memory use becomes significant, so having reasonable default values would be useful for people to see when they look at the Throughput sample for guidance.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557939?ContentTypeID=1</link><pubDate>Mon, 05 Jan 2026 14:37:02 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b0a66ec1-fcc5-4523-9877-84c47f6dd233</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;Hi Mike,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Happy New Year!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sorry for the late reply. I got the following answers from the team:&lt;/p&gt;
[quote user="variant"]a. Can you please just reply yes or no to the question: Is there any benefit i&lt;span&gt;f you set the &lt;strong&gt;network core&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;CONFIG_BT_BUF_ACL_RX_SIZE to greater than 251 if the app core has&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE=500 (the MTU size)?&lt;/span&gt;[/quote]
&lt;p&gt;&lt;span&gt;No.&amp;nbsp;Making it bigger than 255 on the network core shouldn&amp;#39;t bring any benefit.&lt;/span&gt;&lt;/p&gt;
[quote user="variant"]b.&amp;nbsp;Again, this can have a yes or no reply&lt;span&gt;:&amp;nbsp; Does the SDC nak a received packet if it doesn&amp;#39;t have enough CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT buffers for a particular connection to store the packet? If so, we can use a sniffer to know if that is happening.&lt;/span&gt;[/quote]
&lt;p&gt;In such a case, SDC will NAK a received packet only if a device has some data to send. If the device doesn&amp;#39;t have any data to send, it will simply close the current connection event (so it will not send an empty packet just to NAK reception) and will receive retransmission of the packet in the next connection event. However, it is an implementation detail, so we don&amp;#39;t&amp;nbsp;recommend relying on this behavior.&lt;/p&gt;
[quote user="variant"]c. &amp;nbsp;I was hoping to get a suggestion for best throughput such as set the&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT in the app core to be larger than the net core&amp;#39;s value.&amp;nbsp; Or, should the app core and net core values be equal for best throughput? Can you provide such a suggestion?[/quote]
&lt;p&gt;&lt;span&gt;I can&amp;#39;t provide any universal recommendation. My suggestion would be to fine-tune the amount and sizes of buffers depending on application needs and CPU utilization.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-Amanda H.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557512?ContentTypeID=1</link><pubDate>Mon, 22 Dec 2025 10:50:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5594cc34-9772-4857-9169-ace42793d038</guid><dc:creator>grzegorz</dc:creator><description>&lt;p&gt;Thank you &lt;a href="https://devzone.nordicsemi.com/members/variant"&gt;variant&lt;/a&gt;&amp;nbsp;&amp;nbsp;I&amp;#39;m sorry I didn&amp;#39;t notice it&amp;#39;s about&amp;nbsp;nRF5340. I&amp;#39;m using NRF54L15 and there is just one core.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557491?ContentTypeID=1</link><pubDate>Sun, 21 Dec 2025 23:53:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f390205d-4807-49f1-9915-1073a1621d3f</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/members/grzegorz"&gt;grzegorz&lt;/a&gt;&amp;nbsp;For your case, did you set both the app core and net core to&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT=10? It seems that your net core has 3 buffers and your app core has 10.&lt;br /&gt;&lt;br /&gt;For the&amp;nbsp;HCI_LE_Read_Buffer_Size command, per the spec:&lt;br /&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1766360551954v1.png" alt=" " /&gt;&lt;br /&gt;It seems the warning is that you are configuring the host with 10 buffers to send to the controller, but the controller has only 3, which is inefficient.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557486?ContentTypeID=1</link><pubDate>Sat, 20 Dec 2025 14:51:33 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:aed9ed05-40db-4e64-a3aa-27487ab168bf</guid><dc:creator>grzegorz</dc:creator><description>&lt;p&gt;I&amp;#39;m also waiting fot the answer. If I set&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT=10 then I get warning:&lt;/p&gt;
&lt;p&gt;&amp;lt;wrn&amp;gt; bt_hci_core: Num of Controller&amp;#39;s ACL packets != ACL bt_conn_tx contexts (3 != 10)&lt;/p&gt;
&lt;p&gt;So it seems there is no point in changing&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/557366?ContentTypeID=1</link><pubDate>Thu, 18 Dec 2025 19:07:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c0c96a01-9af8-4623-9274-d7a4f07a0705</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;Will my re-worded questions be able to be answered?&lt;br /&gt;Thanks.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/556055?ContentTypeID=1</link><pubDate>Tue, 02 Dec 2025 21:19:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:71817de0-ad2d-4d3a-8a21-fa4c1b6649f8</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;Thanks Amanda.&amp;nbsp; Sorry, but I have some follow ups. I had already read the Kconfig help&amp;#39;s you replied with, and I do not feel those helps answered my questions.&lt;/p&gt;
&lt;p&gt;a. Can you please just reply yes or no to the question: Is there any benefit i&lt;span&gt;f you set the &lt;strong&gt;network core&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;CONFIG_BT_BUF_ACL_RX_SIZE to greater than 251 if the app core has&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE=500 (the MTU size)?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;b.&amp;nbsp;Again, this can have a yes or no reply&lt;span&gt;:&amp;nbsp; Does the SDC nak a received packet if it doesn&amp;#39;t have enough CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT buffers for a particular connection to store the packet? If so, we can use a sniffer to know if that is happening.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;c. &amp;nbsp;I was hoping to get a suggestion for best throughput such as set the&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT in the app core to be larger than the net core&amp;#39;s value.&amp;nbsp; Or, should the app core and net core values be equal for best throughput? Can you provide such a suggestion?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/556054?ContentTypeID=1</link><pubDate>Tue, 02 Dec 2025 20:40:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ef520e28-aeec-4578-983c-2dee652a7b59</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
[quote user="variant"]&lt;span&gt;a. What benefit do you get if you set the network core&amp;nbsp;&lt;/span&gt;CONFIG_BT_BUF_ACL_RX_SIZE to greater than 251 if the app core has&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE=500 (the MTU size)?&amp;nbsp; That is, won&amp;#39;t the network core receive max 251 bytes per packet over the air, which would then be sent to the app core with the larger 500 size for L2CAP reassembly? How would the network core make use of&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE&amp;gt;251?[/quote]
&lt;p&gt;&lt;span&gt;For BLE, the maximum LL data length on air is 251 bytes, so setting the &lt;code dir="ltr"&gt;CONFIG_BT_BUF_ACL_RX_SIZE&lt;/code&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;above 251 does not increase the over‑the‑air PDU size.&amp;nbsp;&lt;/span&gt;&lt;span&gt;The app core’s larger&amp;nbsp;&lt;/span&gt;&lt;code dir="ltr"&gt;CONFIG_BT_BUF_ACL_RX_SIZE&lt;/code&gt;&lt;span&gt;&amp;nbsp;simply means its host stack can hold a larger reassembled PDU.&amp;nbsp;You can set&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE to 251 in the prj.conf as the DevAcademy course&amp;nbsp;&lt;a href="https://academy.nordicsemi.com/courses/bluetooth-low-energy-fundamentals/lessons/lesson-3-bluetooth-le-connections/topic/blefund-lesson-3-exercise-2/"&gt;https://academy.nordicsemi.com/courses/bluetooth-low-energy-fundamentals/lessons/lesson-3-bluetooth-le-connections/topic/blefund-lesson-3-exercise-2/&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
[quote user="variant"]b. How can you determine if the&amp;nbsp;CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT default of 2 is too small? Does the SDC nak a packet if it doesn&amp;#39;t have enough buffers for a particular connection?&amp;nbsp;[/quote]
&lt;p&gt;With the default count, the application is expected to be able to empty the buffers during a connection event. That is, non-default values (&amp;gt;2) should only be used when&lt;br /&gt; the CPU utilization is so high that the application is not able to read data&amp;nbsp;fast enough during connection events. Value 1 should be used to save memory when reduced throughput is accepted.&lt;/p&gt;
[quote user="variant"]As for the&amp;nbsp;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT, my understanding is that if there are not enough tx buffers, the More Data bit will not be set if it could be set. Is that right?[/quote]
&lt;p&gt;&amp;nbsp;It might be because the controller (LL) does not get data fast enough from the host. You can try to increase&amp;nbsp;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
[quote user="variant"]c. What is the relation of the&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT for the app core and network core?[/quote]
&lt;p&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;BLE&lt;/span&gt;&amp;nbsp;on the nRF5340 splits&amp;nbsp;the Bluetooth LE Controller and the host part of the Bluetooth LE stack and runs them on different cores.&amp;nbsp;&lt;span&gt;When splitting the Bluetooth LE Controller and the Host, run the Bluetooth LE Controller on the network core and the host part of the Bluetooth LE stack and the application logic on the application core.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="(in Kconfig reference v&amp;amp;nbsp;)" href="https://docs.nordicsemi.com/bundle/ncs-latest/page/kconfig/index.html#CONFIG_BT_BUF_ACL_TX_COUNT"&gt;&lt;code&gt;&lt;span&gt;CONFIG_BT_BUF_ACL_TX_COUNT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&amp;nbsp;is the&amp;nbsp;&lt;span&gt;Number of outgoing ACL data buffers sent from the Host to the Controller. This determines the maximum amount of data packets the Host can have queued in the Controller before waiting for the to notify the Host that more packets can be queued with the Number of Completed Packets event. The buffers are shared between all of the connections and the Host determines how to divide the buffers between the connections. The Controller will return this value in the HCI LE Read Buffer Size command response.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;-Amanda H.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/555923?ContentTypeID=1</link><pubDate>Mon, 01 Dec 2025 21:30:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f6bab0f5-0e3a-4b64-8c22-bf023334bb98</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;Thanks&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/members/troytucker"&gt;troytucker&lt;/a&gt;&amp;nbsp;for your reply&lt;br /&gt;&lt;br /&gt;I spent quite a bit of time looking into #1 thanks to what you pointed out. However, I found that the system heap&amp;nbsp;with&amp;nbsp;size CONFIG_HEAP_MEM_POOL_SIZE only needs&amp;nbsp;&lt;span&gt;CONFIG_HEAP_MEM_POOL_SIZE&lt;/span&gt;&lt;span&gt;=704 for the network core, as the worst case&amp;nbsp;for either central or peripheral&amp;nbsp;role in the Throughput sample.&amp;nbsp; In my opinion, the default 8 KB heap is way overkill and wasteful, at least for the throughput sample, when you can increase&amp;nbsp;BLE-related buffer sizes and counts instead for multiple connections.&lt;br /&gt;&lt;br /&gt;I used NCS 2.6.4 to investigate. I employed use of&amp;nbsp;&lt;/span&gt;CONFIG_SYS_HEAP_RUNTIME_STATS on both cores, as well as adding several debug printk&amp;#39;s.&lt;br /&gt;&lt;br /&gt;One thing I noticed is that there are two heaps being used in both cores.&lt;/p&gt;
&lt;p&gt;1. The&amp;nbsp;_SYSTEM_HEAP of size&amp;nbsp;CONFIG_HEAP_MEM_POOL_SIZE in&amp;nbsp;&lt;span&gt;ncs\v2.6.4\&lt;/span&gt;zephyr\kernel\mempool.c.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;K_HEAP_DEFINE(_system_heap, CONFIG_HEAP_MEM_POOL_SIZE);
#define _SYSTEM_HEAP (&amp;amp;_system_heap)
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. The&amp;nbsp;z_malloc_heap of size&amp;nbsp;&lt;/span&gt;HEAP_SIZE&amp;nbsp;&lt;span&gt;in ncs\v2.6.4\z&lt;/span&gt;ephyr\lib\libc\common\source\stdlib\malloc.c.&lt;/p&gt;
&lt;p&gt;For our case of z_malloc_heap:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;#   define USED_RAM_END_ADDR   POINTER_TO_UINT(&amp;amp;_end)\
/*
 * No partition, heap can just start wherever _end is, with
 * suitable alignment
 */
#   define HEAP_BASE	ROUND_UP(USED_RAM_END_ADDR, HEAP_ALIGN)

#   define HEAP_SIZE	ROUND_DOWN((RAM_SIZE -	\
		((size_t) HEAP_BASE - (size_t) RAM_ADDR)), HEAP_ALIGN)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;That is, the malloc heap begins where ever the used-RAM ends, and the heap ends at the end of the RAM itself.&lt;/p&gt;
&lt;p&gt;k_malloc() uses the _SYSTEM_HEAP, while malloc() uses the z_malloc_heap.&lt;br /&gt;&lt;br /&gt;For any heap allocation, both heaps will eventually call sys_heap_alloc() in&amp;nbsp;C:\ncs\v2.6.4\zephyr\lib\os\heap.c., which calls&amp;nbsp;increase_allocated_bytes() if&amp;nbsp;CONFIG_SYS_HEAP_RUNTIME_STATS=y.&lt;br /&gt;&lt;br /&gt;In&amp;nbsp;&lt;span&gt;increase_allocated_bytes(), I added these two lines at the end:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;	printk(&amp;quot;increase_allocated_bytes(): allocated %zu, free %zu, max allocated %zu, pHeapStruct=%p\n&amp;quot;,
		h-&amp;gt;allocated_bytes, h-&amp;gt;free_bytes,
		h-&amp;gt;max_allocated_bytes, (void*)h);&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The pHeapStruct above tells me which heap is being used for the allocation. I recorded the address of both heap structures at startup in mempool.c/k_thread_system_pool_assign() and malloc.c/malloc_prepare(). One of those two heap structures will show up in the print of pHeapStruct when&amp;nbsp;increase_allocated_bytes() is called.&lt;br /&gt;&lt;br /&gt;At bootup, the network core in the Throughput sample makes just two allocations from the _SYSTEM_HEAP&amp;nbsp;each of size 312 bytes (316 bytes aligned). One for the rx vring and one for the tx vring:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;static int vq_setup(struct ipc_static_vrings *vr, unsigned int role)
{
	vr-&amp;gt;vq[RPMSG_VQ_0] = virtqueue_allocate(vr-&amp;gt;vring_size);
	if (vr-&amp;gt;vq[RPMSG_VQ_0] == NULL) {
		return -ENOMEM;
	}

	vr-&amp;gt;vq[RPMSG_VQ_1] = virtqueue_allocate(vr-&amp;gt;vring_size);
	if (vr-&amp;gt;vq[RPMSG_VQ_1] == NULL) {
		return -ENOMEM;
	}

&lt;/pre&gt;&lt;br /&gt;&lt;img style="max-height:240px;max-width:320px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1764621090852v1.png" /&gt;&lt;br /&gt;&lt;br /&gt;No further allocations in the network core occur when you run the throughput test. And malloc allocations never occur.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Those two allocations use 316*2=632 bytes.&amp;nbsp; I verified with&amp;nbsp;&lt;/span&gt;CONFIG_HEAP_MEM_POOL_SIZE=512 that IPC init fails (&lt;em&gt;&amp;lt;err&amp;gt; hci_ipc: IPC service instance initialization failed: -12&lt;/em&gt;). I verified the sample runs the test successfully on both sides if&amp;nbsp;&lt;span&gt;CONFIG_HEAP_MEM_POOL_SIZE&lt;/span&gt;&lt;span&gt;=704. It probably can go even lower.&amp;nbsp; Regardless, 8192 seems to be way overkill.&lt;br /&gt;&lt;br /&gt;As an aside, the app core also had those same two vring allocations from the system heap. The central app core is the only image that had an additional allocation other than the two vrings.&amp;nbsp; That occurred in&amp;nbsp;&lt;/span&gt;user_data_alloc()&amp;nbsp;&lt;span&gt;in&amp;nbsp;v2.6.4\nrf\subsys\bluetooth\gatt_dm.c, which called&amp;nbsp;&lt;/span&gt;k_calloc() for the _SYSTEM_HEAP for an additional 124 bytes, and that&amp;#39;s it. As for the network core, no mallocs occurred using the &lt;span&gt;z_malloc_heap.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. Follow up:&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/members/amanda"&gt;Amanda Hsieh&lt;/a&gt;&amp;nbsp;.&amp;nbsp;&lt;br /&gt;a. What benefit do you get if you set the network core&amp;nbsp;&lt;/span&gt;CONFIG_BT_BUF_ACL_RX_SIZE to greater than 251 if the app core has&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE=500 (the MTU size)?&amp;nbsp; That is, won&amp;#39;t the network core receive max 251 bytes per packet over the air, which would then be sent to the app core with the larger 500 size for L2CAP reassembly? How would the network core make use of&amp;nbsp;CONFIG_BT_BUF_ACL_RX_SIZE&amp;gt;251?&lt;br /&gt;&lt;br /&gt;b. How can you determine if the&amp;nbsp;CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT default of 2 is too small? Does the SDC nak a packet if it doesn&amp;#39;t have enough buffers for a particular connection?&amp;nbsp; As for the&amp;nbsp;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT, my understanding is that if there are not enough tx buffers, the More Data bit will not be set if it could be set. Is that right?&lt;br /&gt;&lt;br /&gt;c. What is the relation of the&amp;nbsp;CONFIG_BT_BUF_ACL_TX_COUNT for the app core and network core?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Choice of controller configurations in BLE Throughput sample</title><link>https://devzone.nordicsemi.com/thread/554737?ContentTypeID=1</link><pubDate>Wed, 19 Nov 2025 07:49:10 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dc0213ad-0136-4fdd-b7b9-26dc1755f68a</guid><dc:creator>troytucker</dc:creator><description>&lt;p&gt;Hello, I think I can answer your questions.&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp;Because the IPC/RPMsg/virtqueue system on the nRF5340 network core uses dynamic allocation, even if the throughput sample itself never calls k_malloc().&lt;br /&gt;The 8 KB heap is simply a safe default to ensure that RPMsg, libmetal, and virtqueue buffers always have enough memory.&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp;Because the sample is meant to run out-of-the-box and demonstrate throughput, not serve as a tuning guide.&lt;br /&gt;However, those parameters absolutely do affect throughput and memory usage, especially for multiple connections, and they should be tuned in real applications.&lt;/p&gt;
&lt;p&gt;3.&amp;nbsp;Yes, in newer NCS releases, BT_BUF_ACL_TX_COUNT is also used when the SoftDevice Controller is enabled.&lt;br /&gt;The old statement (&amp;ldquo;only used by Zephyr LL&amp;rdquo;) is no longer correct for modern NCS.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>