硬汉嵌入式论坛

 找回密码
 立即注册
查看: 555|回复: 5
收起左侧

[ThreadX全家桶] 新建任务成功,但没执行,什么原因?

[复制链接]

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2023-10-2 02:40:28 | 显示全部楼层 |阅读模式
几个任务都是这样的情况。tx_thread_create返回是成功的。但就是不执行。


比如 ret = tx_thread_create(&fx_app_thread, FX_APP_THREAD_NAME, fx_app_thread_entry, 0, pointer, FX_APP_THREAD_STACK_SIZE,
                         FX_APP_THREAD_PRIO, FX_APP_PREEMPTION_THRESHOLD, FX_APP_THREAD_TIME_SLICE, FX_APP_THREAD_AUTO_START);
成功了。

然后没进void fx_app_thread_entry(ULONG thread_input)

都是用的CUBEMX生成的。空间内存都给够了的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106912
QQ
发表于 2023-10-2 06:50:24 | 显示全部楼层
工程应该没有创建好吧,看看卡死在什么地方了。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-2 15:22:27 | 显示全部楼层
eric2013 发表于 2023-10-2 06:50
工程应该没有创建好吧,看看卡死在什么地方了。

和HOST初始化有关,毕竟HOST没插入任何外设,看来,这个也不能一开始就初始化内存这些,得检测到设备插入后,再进行HOST相关的操作,如何设备断开,应该把HOST相关的都释放,我想应该这样做。只是官方没这方面的示例,自己弄就非常花时间了。和之前FREERTOS+HOST+DEVICE一样的实现方法,应该就可以。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-2 15:27:18 | 显示全部楼层
eric2013 发表于 2023-10-2 06:50
工程应该没有创建好吧,看看卡死在什么地方了。

如果用ThreadX还有一个比较棘手的问题,就是功耗,在FREERTOS下通过不同的工作状态/需求,动态调整了主频的。ThreadX下可能比较麻烦。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106912
QQ
发表于 2023-10-2 16:01:33 | 显示全部楼层
ccschen 发表于 2023-10-2 15:27
如果用ThreadX还有一个比较棘手的问题,就是功耗,在FREERTOS下通过不同的工作状态/需求,动态调整了主频 ...

使用RTOS和主频没关系,你自己随意设置。只要你做的驱动支持动态运行的主频即可。

ThreadX的低功耗也是tickless模式,有需要可以开启。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106912
QQ
发表于 2023-10-2 16:05:48 | 显示全部楼层
ccschen 发表于 2023-10-2 15:22
和HOST初始化有关,毕竟HOST没插入任何外设,看来,这个也不能一开始就初始化内存这些,得检测到设备插入 ...

USBX协议栈本身创建的任务管理,不需要用户去管,这个他自己会动态的管理,这个是完全没问题的。

比如模拟U盘管理,你自己仅需注册挂载和卸载管理即可。


[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: OpenUsbStorage
*	功能说明: 打开SD卡的U盘模拟
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void OpenUsbStorage(void)
{
    static uint32_t uiFirstRun = 0;
    UINT  status =  UX_SUCCESS;
    ULONG device_framework_hs_length;
    ULONG device_framework_fs_length;
    ULONG string_framework_length;
    ULONG languge_id_framework_length;
    UCHAR *device_framework_high_speed;
    UCHAR *device_framework_full_speed;
    UCHAR *string_framework;
    UCHAR *language_id_framework;

  
    if(uiFirstRun == 0)
    {
        uiFirstRun = 1;
        
        /* 初始化USBX */
        ux_system_initialize(usbx_pool, USBX_MEMORY_SIZE, UX_NULL, 0);
    }


    /* USB设备协议栈初始化 */    
    device_framework_high_speed = USBD_Get_Device_Framework_Speed(HIGH_SPEED, &device_framework_hs_length);
    device_framework_full_speed = USBD_Get_Device_Framework_Speed(FULL_SPEED, &device_framework_fs_length);
    string_framework = USBD_Get_String_Framework(&string_framework_length);
    language_id_framework = USBD_Get_Language_Id_Framework(&languge_id_framework_length);

    status =  _ux_device_stack_initialize(device_framework_high_speed,
                                            device_framework_hs_length,
                                            device_framework_full_speed,
                                            device_framework_fs_length,
                                            string_framework,
                                            string_framework_length,
                                            language_id_framework,
                                            languge_id_framework_length, UX_NULL);

    if (status != UX_SUCCESS)
    {
        return;
    }
	
    /* 初始化SD卡 */
    BSP_SD_Init();

    /* 1个USB模拟U盘设备 */
    storage_parameter.ux_slave_class_storage_parameter_number_lun = 1;

    /* 设置相关参数并注册读写API */
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_last_lba        = (ULONG)(uSdHandle.SdCard.BlockNbr - 1);
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_block_length    = uSdHandle.SdCard.BlockSize;
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_type            =  0;
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_removable_flag  =  0x80;
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_read            =  app_usb_device_thread_media_read;
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_write           =  app_usb_device_thread_media_write; 
    storage_parameter.ux_slave_class_storage_parameter_lun[0].ux_slave_class_storage_media_status          =  app_usb_device_thread_media_status;

    /* 注册USB模U盘到接口0,配置1*/
    status =  _ux_device_stack_class_register(_ux_system_slave_class_storage_name, _ux_device_class_storage_entry, 1, 0, (VOID *)&storage_parameter);
                                                                                  
    if (status != UX_SUCCESS)
    {
        return;
    }
  
    /* 配置USB GPIO, NVIC */
    {
        GPIO_InitTypeDef  GPIO_InitStruct = {0};

        __HAL_RCC_GPIOA_CLK_ENABLE();

        GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        /* 使能USB FS时钟 */
        __HAL_RCC_USB2_OTG_FS_CLK_ENABLE();

        /* 在睡眠模式下禁用USB时钟 */
        __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE();
        
        /* 配置USB FS中断 */
        HAL_NVIC_SetPriority(OTG_FS_IRQn, 0x2, 0); 
        HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
    }

    /* 初始化USB */
    {
        HAL_PWREx_EnableUSBVoltageDetector();

        memset(&hpcd_USB_OTG_FS, 0x0, sizeof(PCD_HandleTypeDef));
        hpcd_USB_OTG_FS.Instance = USB2_OTG_FS;
        hpcd_USB_OTG_FS.Init.dev_endpoints = 8;
        hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = 0;
        hpcd_USB_OTG_FS.Init.ep0_mps = 0x40;
        hpcd_USB_OTG_FS.Init.low_power_enable = 0;
        hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
        hpcd_USB_OTG_FS.Init.Sof_enable = 0;
        hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
        hpcd_USB_OTG_FS.Init.vbus_sensing_enable = 0;
        hpcd_USB_OTG_FS.Init.lpm_enable = 0;

        /* 初始化USB  */
        HAL_PCD_Init(&hpcd_USB_OTG_FS);

        /* 设置TX FIFO和RX FIFO */
        HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 1024);
        HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 64);
        HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 1024);

        /* 注册STM32到USBX协议栈并初始化 */
        status =  ux_dcd_stm32_initialize((ULONG)USB2_OTG_FS, (ULONG)&hpcd_USB_OTG_FS);

        if (status != FX_SUCCESS)
        {
            return;
        }
        
    }
    
    /* 启动USB */
    HAL_PCD_Start(&hpcd_USB_OTG_FS);
    
}

/*
*********************************************************************************************************
*	函 数 名: CloseUsbStorage
*	功能说明: 关闭SD卡的U盘模拟
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void  CloseUsbStorage(void)
{
    /* 停止USB */
    HAL_PCD_Stop(&hpcd_USB_OTG_FS);

    /* 复位USB相关配置 */    
    _ux_dcd_stm32_uninitialize((ULONG)USB2_OTG_FS, (ULONG)&hpcd_USB_OTG_FS);
    _ux_device_stack_uninitialize();
    _ux_device_stack_class_unregister(_ux_system_slave_class_storage_name, _ux_device_class_storage_entry);

    /* 关闭USB时钟,中断,并复位SD卡 */
    __HAL_RCC_USB2_OTG_FS_CLK_DISABLE();
    HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
    HAL_PCD_DeInit(&hpcd_USB_OTG_FS);  
    BSP_SD_DeInit();   
}




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 16:05 , Processed in 0.292684 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表