This is an automated email from the ASF dual-hosted git repository.
xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 0ed10c15f examples/dronecan: Align the libcanard memory pool.
0ed10c15f is described below
commit 0ed10c15f1050121b76acdc52e7d526ba97178ee
Author: iamadahn <[email protected]>
AuthorDate: Fri Nov 6 23:26:53 2026 +0300
examples/dronecan: Align the libcanard memory pool.
Use 8-byte alignment to prevent unaligned accesses on Cortex-M0+.
Fix code style where possible.
Assisted-by: Codex:GPT-6-Astra
Signed-off-by: iamadahn <[email protected]>
---
examples/dronecan/canard_main.c | 167 ++++++++++++++++++++--------------------
1 file changed, 85 insertions(+), 82 deletions(-)
diff --git a/examples/dronecan/canard_main.c b/examples/dronecan/canard_main.c
index a5a55ebe9..75bed9e61 100644
--- a/examples/dronecan/canard_main.c
+++ b/examples/dronecan/canard_main.c
@@ -108,10 +108,10 @@
static CanardInstance canard;
-/* Arena for memory allocation, used by the library */
+/* Memory arena, aligned for the library's pointers and 64-bit fields */
static uint8_t canard_memory_pool
- [CONFIG_EXAMPLES_DRONECAN_NODE_MEM_POOL_SIZE];
+ [CONFIG_EXAMPLES_DRONECAN_NODE_MEM_POOL_SIZE] aligned_data(8);
static uint8_t unique_id[UNIQUE_ID_LENGTH_BYTES] =
{ 0x00, 0x00, 0x00, 0x00,
@@ -202,6 +202,7 @@ static void onTransferReceived(CanardInstance *ins,
printf("GetNodeInfo request from %d\n", transfer->source_node_id);
uint8_t buffer[UAVCAN_GET_NODE_INFO_RESPONSE_MAX_SIZE];
+
memset(buffer, 0, UAVCAN_GET_NODE_INFO_RESPONSE_MAX_SIZE);
/* NodeStatus */
@@ -233,6 +234,7 @@ static void onTransferReceived(CanardInstance *ins,
/* Name */
const size_t name_len = strlen(APP_NODE_NAME);
+
memcpy(&buffer[41], APP_NODE_NAME, name_len);
const size_t total_size = 41 + name_len;
@@ -243,25 +245,25 @@ static void onTransferReceived(CanardInstance *ins,
const int resp_res =
#if CANARD_ENABLE_CANFD
- canardRequestOrRespond(ins,
- transfer->source_node_id,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
- &transfer->transfer_id,
- transfer->priority,
- CanardResponse,
- &buffer[0],
- (uint16_t)total_size, canfd);
+ canardRequestOrRespond(ins,
+ transfer->source_node_id,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
+ &transfer->transfer_id,
+ transfer->priority,
+ CanardResponse,
+ &buffer[0],
+ (uint16_t)total_size, canfd);
#else
- canardRequestOrRespond(ins,
- transfer->source_node_id,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
- &transfer->transfer_id,
- transfer->priority,
- CanardResponse,
- &buffer[0],
- (uint16_t) total_size);
+ canardRequestOrRespond(ins,
+ transfer->source_node_id,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
+ &transfer->transfer_id,
+ transfer->priority,
+ CanardResponse,
+ &buffer[0],
+ (uint16_t) total_size);
#endif
if (resp_res <= 0)
{
@@ -327,83 +329,84 @@ void process1HzTasks(uint64_t timestamp_usec)
/* Printing the memory usage statistics. */
- {
- const CanardPoolAllocatorStatistics stats =
- canardGetPoolAllocatorStatistics(&canard);
- const unsigned peak_percent =
- 100U * stats.peak_usage_blocks / stats.capacity_blocks;
+ {
+ const CanardPoolAllocatorStatistics stats =
+ canardGetPoolAllocatorStatistics(&canard);
+ const unsigned peak_percent =
+ 100U * stats.peak_usage_blocks / stats.capacity_blocks;
#ifdef CONFIG_DEBUG_CAN
- printf("Memory pool stats: capacity %u blocks, usage %u blocks,"
- " peak usage %u blocks (%u%%)\n",
- stats.capacity_blocks, stats.current_usage_blocks,
- stats.peak_usage_blocks, peak_percent);
+ printf("Memory pool stats: capacity %u blocks, usage %u blocks,"
+ " peak usage %u blocks (%u%%)\n",
+ stats.capacity_blocks, stats.current_usage_blocks,
+ stats.peak_usage_blocks, peak_percent);
#endif
- /* The recommended way to establish the minimal size of the memory pool
- * is to stress-test the application and record the worst case memory
- * usage.
- */
+ /* The recommended way to establish the minimal size of the memory pool
+ * is to stress-test the application and record the worst case memory
+ * usage.
+ */
- if (peak_percent > 70)
- {
- puts("WARNING: ENLARGE MEMORY POOL");
- }
- }
+ if (peak_percent > 70)
+ {
+ puts("WARNING: ENLARGE MEMORY POOL");
+ }
+ }
/* Transmitting the node status message periodically. */
- {
- uint8_t buffer[UAVCAN_NODE_STATUS_MESSAGE_SIZE];
- makeNodeStatusMessage(buffer);
+ {
+ uint8_t buffer[UAVCAN_NODE_STATUS_MESSAGE_SIZE];
- static uint8_t transfer_id;
+ makeNodeStatusMessage(buffer);
- const int bc_res =
+ static uint8_t transfer_id;
+
+ const int bc_res =
#if CANARD_ENABLE_CANFD
- canardBroadcast(&canard, UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE,
- UAVCAN_NODE_STATUS_DATA_TYPE_ID, &transfer_id,
- CANARD_TRANSFER_PRIORITY_LOW,
- buffer, UAVCAN_NODE_STATUS_MESSAGE_SIZE, canfd);
+ canardBroadcast(&canard, UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE,
+ UAVCAN_NODE_STATUS_DATA_TYPE_ID, &transfer_id,
+ CANARD_TRANSFER_PRIORITY_LOW,
+ buffer, UAVCAN_NODE_STATUS_MESSAGE_SIZE, canfd);
#else
- canardBroadcast(&canard, UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE,
- UAVCAN_NODE_STATUS_DATA_TYPE_ID, &transfer_id,
- CANARD_TRANSFER_PRIORITY_LOW,
- buffer, UAVCAN_NODE_STATUS_MESSAGE_SIZE);
+ canardBroadcast(&canard, UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE,
+ UAVCAN_NODE_STATUS_DATA_TYPE_ID, &transfer_id,
+ CANARD_TRANSFER_PRIORITY_LOW,
+ buffer, UAVCAN_NODE_STATUS_MESSAGE_SIZE);
#endif
- if (bc_res <= 0)
- {
- fprintf(stderr, "Could not broadcast node status; error %d\n",
- bc_res);
- }
- }
-
- {
- static uint8_t transfer_id;
- uint8_t payload[1];
- uint8_t dest_id = 2;
- const int resp_res =
+ if (bc_res <= 0)
+ {
+ fprintf(stderr, "Could not broadcast node status; error %d\n",
+ bc_res);
+ }
+ }
+
+ {
+ static uint8_t transfer_id;
+ uint8_t payload[1];
+ uint8_t dest_id = 2;
+ const int resp_res =
#if CANARD_ENABLE_CANFD
- canardRequestOrRespond(&canard, dest_id,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
- &transfer_id,
- CANARD_TRANSFER_PRIORITY_LOW, CanardRequest,
- payload, 0, canfd);
+ canardRequestOrRespond(&canard, dest_id,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
+ &transfer_id,
+ CANARD_TRANSFER_PRIORITY_LOW, CanardRequest,
+ payload, 0, canfd);
#else
- canardRequestOrRespond(&canard, dest_id,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
- UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
- &transfer_id,
- CANARD_TRANSFER_PRIORITY_LOW, CanardRequest,
- payload, 0);
+ canardRequestOrRespond(&canard, dest_id,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE,
+ UAVCAN_GET_NODE_INFO_DATA_TYPE_ID,
+ &transfer_id,
+ CANARD_TRANSFER_PRIORITY_LOW, CanardRequest,
+ payload, 0);
#endif
- if (resp_res <= 0)
- {
- fprintf(stderr, "Could not request GetNodeInfo; error %d\n",
- resp_res);
- }
- }
+ if (resp_res <= 0)
+ {
+ fprintf(stderr, "Could not request GetNodeInfo; error %d\n",
+ resp_res);
+ }
+ }
node_mode = UAVCAN_NODE_MODE_OPERATIONAL;
}
@@ -500,7 +503,6 @@ static int canard_daemon(int argc, char *argv[])
/* Open the CAN device for reading */
-
#ifdef CONFIG_NET_CAN
const char * const can_iface_name = "can0";
@@ -620,6 +622,7 @@ int main(int argc, FAR char *argv[])
if (ret < 0)
{
int errcode = errno;
+
printf("canard_main: ERROR: Failed to start canard_daemon: %d\n",
errcode);
return EXIT_FAILURE;