app_shmem: renamespace and document

The public APIs for application shared memory are now
properly documented and conform to zephyr naming
conventions.

Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
Andrew Boie 2019-01-30 13:06:13 -08:00 committed by Andrew Boie
commit 85e1fcb02a
6 changed files with 61 additions and 39 deletions

View file

@ -37,11 +37,11 @@ The general usage is as follows. Define CONFIG_APP_SHARED_MEM=y in the
proj.conf file in the project folder. Include app_memory/app_memdomain.h
in the userspace source file. Mark the variable to be placed in
a memory partition. The two markers are for data and bss respectively:
_app_dmem(id) and _app_bmem(id). The id is used as the partition name.
K_APP_DMEM(id) and K_APP_BMEM(id). The id is used as the partition name.
The resulting section name can be seen in the linker.map as
"data_smem_id" and "data_smem_idb".
To create a k_mem_partition, call the macro appmem_partition(part0)
To create a k_mem_partition, call the macro K_APPMEM_PARTITION_DEFINE(part0)
where "part0" is the name then used to refer to that partition.
This macro only creates a function and necessary data structures for
the later "initialization".
@ -55,12 +55,12 @@ Example:
.. code-block:: c
/* create partition at top of file outside functions */
appmem_partition(part0);
K_APPMEM_PARTITION_DEFINE(part0);
/* create domain */
struct k_mem_domain dom0;
/* assign variables to the domain */
_app_dmem(part0) int var1;
_app_bmem(part0) static volatile int var2;
K_APP_DMEM(part0) int var1;
K_APP_BMEM(part0) static volatile int var2;
int main()
{
@ -78,7 +78,7 @@ app_macro_support.h:
.. code-block:: c
FOR_EACH(appmem_partition, part0, part1, part2);
FOR_EACH(K_APPMEM_PARTITION_DEFINE, part0, part1, part2);
Similarly, the appmem_init_part_* can also be used in the macro:

View file

@ -34,17 +34,27 @@
__attribute__((aligned(MEM_DOMAIN_ALIGN_SIZE), \
section("data_smem_" #id "b")))
/*
* Qualifier to collect any object preceded with _app
* and place into section "data_smem_".
* _app_dmem(#) is for variables meant to be stored in .data .
* _app_bmem(#) is intended for static variables that are
* initialized to zero.
/**
* @brief Place data in a partition's data section
*
* Globals tagged with this will end up in the data section for the
* specified memory partition. This data should be initalized to some
* desired value.
*
* @param id Name of the memory partition to associate this data
*/
#define _app_dmem(id) \
#define K_APP_DMEM(id) \
__attribute__((section("data_smem_" #id)))
#define _app_bmem(id) \
/**
* @brief Place data in a partition's bss section
*
* Globals tagged with this will end up in the bss section for the
* specified memory partition. This data will be zeroed at boot.
*
* @param id Name of the memory partition to associate this data
*/
#define K_APP_BMEM(id) \
__attribute__((section("data_smem_" #id "b")))
/*
@ -77,7 +87,19 @@ struct app_region {
#define smem_size_assign(name)
#endif /* CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT */
#define appmem_partition(name) \
/**
* @brief Define an application memory partition with linker support
*
* Defines a k_mem_paritition with the provided name.
* This name may be used with the K_APP_DMEM and K_APP_BMEM macros to
* place globals automatically in this partition.
*
* NOTE: placeholder char variable is defined here to prevent build errors
* if a partition is defined but nothing ever placed in it.
*
* @param name Name of the k_mem_partition to declare
*/
#define K_APPMEM_PARTITION_DEFINE(name) \
extern char *data_smem_##name; \
extern char *data_smem_##name##b; \
smem_size_declare(name); \

View file

@ -27,7 +27,7 @@
*/
/* prepare the memory partition structures */
FOR_EACH(appmem_partition, part0, part1, part2, part3, part4);
FOR_EACH(K_APPMEM_PARTITION_DEFINE, part0, part1, part2, part3, part4);
/* prepare the memory domain structures */
struct k_mem_domain dom0, dom1, dom2;
/* each variable starts with a name defined in main.h

View file

@ -24,20 +24,20 @@ void enc(void);
void pt(void);
void ct(void);
#define _app_user_d _app_dmem(part0)
#define _app_user_b _app_bmem(part0)
#define _app_user_d K_APP_DMEM(part0)
#define _app_user_b K_APP_BMEM(part0)
#define _app_red_d _app_dmem(part1)
#define _app_red_b _app_bmem(part1)
#define _app_red_d K_APP_DMEM(part1)
#define _app_red_b K_APP_BMEM(part1)
#define _app_enc_d _app_dmem(part2)
#define _app_enc_b _app_bmem(part2)
#define _app_enc_d K_APP_DMEM(part2)
#define _app_enc_b K_APP_BMEM(part2)
#define _app_blk_d _app_dmem(part3)
#define _app_blk_b _app_bmem(part3)
#define _app_blk_d K_APP_DMEM(part3)
#define _app_blk_b K_APP_BMEM(part3)
#define _app_ct_d _app_dmem(part4)
#define _app_ct_b _app_bmem(part4)
#define _app_ct_d K_APP_DMEM(part4)
#define _app_ct_b K_APP_BMEM(part4)
/*
* Constant

View file

@ -38,7 +38,7 @@ K_SEM_DEFINE(expect_fault_sem, 0, 1);
* ztest and this test suite. part1 and part2 are for
* subsequent test specifically for this new implementation.
*/
FOR_EACH(appmem_partition, part0, part1, part2);
FOR_EACH(K_APPMEM_PARTITION_DEFINE, part0, part1, part2);
/*
* Create memory domains. dom0 is for the ztest and this
@ -48,10 +48,10 @@ FOR_EACH(appmem_partition, part0, part1, part2);
struct k_mem_domain dom0;
struct k_mem_domain dom1;
_app_dmem(part0) static volatile bool give_uthread_end_sem;
_app_dmem(part0) bool mem_access_check;
K_APP_DMEM(part0) static volatile bool give_uthread_end_sem;
K_APP_DMEM(part0) bool mem_access_check;
_app_bmem(part0) static volatile bool expect_fault;
K_APP_BMEM(part0) static volatile bool expect_fault;
#if defined(CONFIG_X86)
#define REASON_HW_EXCEPTION _NANO_ERR_CPU_EXCEPTION
@ -65,7 +65,7 @@ _app_bmem(part0) static volatile bool expect_fault;
#else
#error "Not implemented for this architecture"
#endif
_app_bmem(part0) static volatile unsigned int expected_reason;
K_APP_BMEM(part0) static volatile unsigned int expected_reason;
/*
* We need something that can act as a memory barrier
@ -312,15 +312,15 @@ static void write_kernel_data(void)
/*
* volatile to avoid compiler mischief.
*/
_app_dmem(part0) volatile int *priv_stack_ptr;
K_APP_DMEM(part0) volatile int *priv_stack_ptr;
#if defined(CONFIG_X86)
/*
* We can't inline this in the code or make it static
* or local without triggering a warning on -Warray-bounds.
*/
_app_dmem(part0) size_t size = MMU_PAGE_SIZE;
K_APP_DMEM(part0) size_t size = MMU_PAGE_SIZE;
#elif defined(CONFIG_ARC)
_app_dmem(part0) s32_t size = (0 - CONFIG_PRIVILEGED_STACK_SIZE -
K_APP_DMEM(part0) s32_t size = (0 - CONFIG_PRIVILEGED_STACK_SIZE -
STACK_GUARD_SIZE);
#endif
@ -377,7 +377,7 @@ static void write_priv_stack(void)
}
_app_bmem(part0) static struct k_sem sem;
K_APP_BMEM(part0) static struct k_sem sem;
/**
* @brief Test to pass a user object to system call
@ -582,7 +582,7 @@ static void user_mode_enter(void)
/* Define and initialize pipe. */
K_PIPE_DEFINE(kpipe, PIPE_LEN, BYTES_TO_READ_WRITE);
_app_bmem(part0) static size_t bytes_written_read;
K_APP_BMEM(part0) static size_t bytes_written_read;
/**
* @brief Test to write to kobject using pipe
@ -634,7 +634,7 @@ static void read_kobject_user_pipe(void)
*/
/* Create bool in part1 partitions */
_app_dmem(part1) bool thread_bool;
K_APP_DMEM(part1) bool thread_bool;
static void shared_mem_thread(void)
{

View file

@ -144,8 +144,8 @@ static inline void unit_test_noop(void)
/* definitions for use with testing application shared memory */
#ifdef CONFIG_APP_SHARED_MEM
#define APPDMEMP0 _app_dmem(part0)
#define APPBMEMP0 _app_bmem(part0)
#define APPDMEMP0 K_APP_DMEM(part0)
#define APPBMEMP0 K_APP_BMEM(part0)
#else
#define APPDMEMP0
#define APPBMEMP0