|
发表于 2021-12-20 20:35:35
|
显示全部楼层
- static Shell shell;
- static char shellBuffer[512] __ALIGNED(4) ;
- struct vx_ringbuffer vxRing;
- static vx_uint8_t VxRingBuffer[128] __ALIGNED(4) ;
- static TX_EVENT_FLAGS_GROUP shellEventFlag;
- static volatile uint8_t shellModuleInit_OK = 0;
- //static SemaphoreHandle_t shellMutex;
- /**
- * @brief 用户shell写
- *
- * @param data 数据
- * @param len 数据长度
- *
- * @return short 实际写入的数据长度
- */
- short userShellWrite(char *data, unsigned short len)
- {
- User_UART_Send(data, len);
- return len;
- }
- /**
- * @brief 用户shell读
- *
- * @param data 数据
- * @param len 数据长度
- *
- * @return short 实际读取到
- */
- short userShellRead(char *data, unsigned short len)
- {
- /* 目前,shell的解读任务,一次只能get一个字节,这里忽略参数:len */
- return vx_ringbuffer_getchar(&vxRing, (vx_uint8_t *)data);
- }
- /**
- * @brief 驱动层接口RingBuffer写函数,将字符设备的接收数据,缓存至RingBuffer
- * 并释放OS Event,通知Shell 线程来解析数据。
- *
- * @param pbuf 字符设备待写入数据
- * @param len 数据长度
- *
- * @return NULL
- */
- void userWriteShellRingbuffer(uint8_t *pbuf, uint16_t len)
- {
- if(0x55 == shellModuleInit_OK)
- {
- vx_ringbuffer_put(&vxRing, pbuf, len);
- /* release flag to shell task */
- if (tx_event_flags_set(&shellEventFlag, 0x01, TX_OR) != TX_SUCCESS)
- {
- VX_ASSERT(1);
- }
- }
- }
- /**
- * @brief 用户shell上锁
- *
- * @param shell shell
- *
- * @return int 0
- */
- int userShellLock(Shell *shell)
- {
- //xSemaphoreTakeRecursive(shellMutex, portMAX_DELAY);
- return 0;
- }
- /**
- * @brief 用户shell解锁
- *
- * @param shell shell
- *
- * @return int 0
- */
- int userShellUnlock(Shell *shell)
- {
- //xSemaphoreGiveRecursive(shellMutex);
- return 0;
- }
- /**
- * @brief 用户shell初始化
- *
- */
- void userShellInit(void)
- {
- //shellMutex = xSemaphoreCreateMutex();
- shell.write = userShellWrite;
- shell.read = userShellRead;
- //shell.lock = userShellLock;
- //shell.unlock = userShellUnlock;
- shellInit(&shell, shellBuffer, 512);
- /* user ringBuffer init */
- vx_ringbuffer_init(&vxRing, VxRingBuffer, 128);
- /* Create the event flags group. */
- if (tx_event_flags_create(&shellEventFlag, "ShellEvent Flag") != TX_SUCCESS)
- {
- VX_ASSERT(1);
- }
- shellModuleInit_OK = 0x55;
- }
- /**
- * @brief 用户shell线程入口函数,目前ShellTask调用的read()接口,一次解析一个Byte,
- * 而uart驱动层使用了DMA_RX接收控制台串口数据,中间使用RingBuffer来做缓冲,
- * 那么,为了提高效率,在uart驱动层调用RingBuffer写接口(一次可能多个字节)后,
- * 触发OS的预定Event通知userShellThread Task, 此处调用 shellTask;在shellTask
- * 内部,循环读取RingBuffer数据后,退出循环,回到任务主体,重新等待uart驱动层数据。
- *
- * @param NULL
- *
- * @return int 0
- */
- void userShellThread_Entry(ULONG thread_input)
- {
- ULONG actual_flags = 0;
- userShellInit();
- while(1)
- {
- if (tx_event_flags_get(&shellEventFlag, 0x01, TX_OR_CLEAR,
- &actual_flags, TX_WAIT_FOREVER) != TX_SUCCESS)
- {
- VX_ASSERT(1);
- }
- else
- {
- shellTask((void *)&shell);
- }
- }
- }
复制代码 |
|