硬汉嵌入式论坛

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

[ThreadX全家桶] 说干就干,修改ThreadX内核移植的tx_initialize_low_level.s汇编文件为C文件

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
发表于 2020-9-18 02:39:19 | 显示全部楼层 |阅读模式
对于我们开发板配套的例子,直接删掉tx_initialize_low_level.s文件,添加我们如下文件即可

tx_init_low_level.c (2.51 KB, 下载次数: 363)

ThreadX搞的两个变量,我们的工程模板都用不上,直接删掉:

_tx_initialize_unused_memory = __INITIAL_SP;
_tx_thread_system_stack_ptr = __Vectors;
QQ截图20200918151351.png

评分

参与人数 1金币 +20 收起 理由
role_2099 + 20 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-18 02:50:50 | 显示全部楼层
MDK汇编启动代码__main,__initial_sp,__Vectors等在C里面的调用方法
http://www.armbbs.cn/forum.php?m ... 0050&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2020-9-18 09:27:54 | 显示全部楼层
还是C看着简单
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-18 10:57:05 | 显示全部楼层

他这个原本就没什么东西,还是用C舒服。
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2020-9-18 11:44:28 | 显示全部楼层
eric2013 发表于 2020-9-18 10:57
他这个原本就没什么东西,还是用C舒服。

官方给的Systick优先级是设置到4,

这优先级设置的很诡异。。。。
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-18 11:58:16 | 显示全部楼层
missfox 发表于 2020-9-18 11:44
官方给的Systick优先级是设置到4,

这优先级设置的很诡异。。。。

所以我直接改成0了。大家可以根据需要做别的修改。
回复

使用道具 举报

5

主题

33

回帖

48

积分

新手上路

积分
48
发表于 2020-9-18 14:55:12 | 显示全部楼层
eric2013 发表于 2020-9-18 11:58
所以我直接改成0了。大家可以根据需要做别的修改。

不如,,,要干就多干几次??比如七次???把arm9 arm-a的都一起劝从良了我就可以顺理成章白嫖了哈哈哈
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-18 15:11:25 | 显示全部楼层
ayuanshop 发表于 2020-9-18 14:55
不如,,,要干就多干几次??比如七次???把arm9 arm-a的都一起劝从良了我就可以顺理成章白嫖了哈 ...

当前就把M内核试了试。
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2020-9-28 16:59:57 | 显示全部楼层
硬汉,这个原文件的 __tx_IntHandler:中断处理函数模板中为什么要 PUSH  {r0, lr} 之后才调用C处理函数?调用函数这两个寄存器不是都会自动入栈的嘛
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-29 05:34:10 | 显示全部楼层
Jacob_xsbn 发表于 2020-9-28 16:59
硬汉,这个原文件的 __tx_IntHandler:中断处理函数模板中为什么要 PUSH  {r0, lr} 之后才调用C处理函数? ...

预留模板

  1. ; VOID InterruptHandler (VOID)
  2. ; {
  3.     PUSH    {r0, lr}

  4. ;    /* Do interrupt handler work here */
  5. ;    /* .... */

  6.     POP     {r0, lr}
  7.     BX      LR
  8. ; }
复制代码
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2020-9-29 15:06:21 | 显示全部楼层

这里为什么要对r0和lr进行入栈和出栈的操作?中断处理函数里调用函数,寄存器不会自动入栈、出栈?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-9-30 10:08:25 | 显示全部楼层
Jacob_xsbn 发表于 2020-9-29 15:06
这里为什么要对r0和lr进行入栈和出栈的操作?中断处理函数里调用函数,寄存器不会自动入栈、出栈?

就是简单的一个模板。中断的话,有手动入栈的也有自带入栈的。
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2020-10-24 14:09:01 | 显示全部楼层
请问一下,用CubeMX转过来的project里面已经有了SysTick的设置,我试着把这个文件里的设置去掉后,threadX就不工作了,我对比了一下,好像没什么区别似的。这是为什么呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2020-10-25 01:08:12 | 显示全部楼层
老马新兵 发表于 2020-10-24 14:09
请问一下,用CubeMX转过来的project里面已经有了SysTick的设置,我试着把这个文件里的设置去掉后,threadX ...

专门做了重定向文件。

ThreadX的系统时钟节拍和STM32的HAL库时间基准都使用Systick的简单方法
http://www.armbbs.cn/forum.php?m ... 9213&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-10-24 21:24:38 | 显示全部楼层
新版本的ThreadX都适用吧?硬汉大哥
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2021-10-25 02:29:55 | 显示全部楼层
morning_enr6U 发表于 2021-10-24 21:24
新版本的ThreadX都适用吧?硬汉大哥

这个代码是万能的,所有版本都适用。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-10-25 09:50:31 | 显示全部楼层
硬汉大哥,最新版本的CubeMX,已经可以单独指定HAL库要使用的定时器了,不必拘泥于SYSTick,下面代码是CubeMX自己生成的:

  1. /**
  2.   * @brief  This function configures the TIM6 as a time base source.
  3.   *         The time source is configured  to have 1ms time base with a dedicated
  4.   *         Tick interrupt priority.
  5.   * @note   This function is called  automatically at the beginning of program after
  6.   *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
  7.   * @param  TickPriority: Tick interrupt priority.
  8.   * @retval HAL status
  9.   */
  10. HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  11. {
  12.     RCC_ClkInitTypeDef    clkconfig;
  13.     uint32_t              uwTimclock, uwAPB1Prescaler;

  14.     uint32_t              uwPrescalerValue;
  15.     uint32_t              pFLatency;
  16.     /*Configure the TIM6 IRQ priority */
  17.     if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  18.     {
  19.         HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority, 0U);

  20.         /* Enable the TIM6 global Interrupt */
  21.         HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  22.         uwTickPrio = TickPriority;
  23.     }
  24.     else
  25.     {
  26.         return HAL_ERROR;
  27.     }

  28.     /* Enable TIM6 clock */
  29.     __HAL_RCC_TIM6_CLK_ENABLE();

  30.     /* Get clock configuration */
  31.     HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

  32.     /* Get APB1 prescaler */
  33.     uwAPB1Prescaler = clkconfig.APB1CLKDivider;
  34.     /* Compute TIM6 clock */
  35.     if (uwAPB1Prescaler == RCC_HCLK_DIV1)
  36.     {
  37.         uwTimclock = HAL_RCC_GetPCLK1Freq();
  38.     }
  39.     else
  40.     {
  41.         uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq();
  42.     }

  43.     /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
  44.     uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);

  45.     /* Initialize TIM6 */
  46.     htim6.Instance = TIM6;

  47.     /* Initialize TIMx peripheral as follow:
  48.     + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
  49.     + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  50.     + ClockDivision = 0
  51.     + Counter direction = Up
  52.     */
  53.     htim6.Init.Period = (1000000U / 1000U) - 1U;
  54.     htim6.Init.Prescaler = uwPrescalerValue;
  55.     htim6.Init.ClockDivision = 0;
  56.     htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

  57.     if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
  58.     {
  59.         /* Start the TIM time Base generation in interrupt mode */
  60.         return HAL_TIM_Base_Start_IT(&htim6);
  61.     }

  62.     /* Return function status */
  63.     return HAL_ERROR;
  64. }
复制代码
  1. /**
  2.   * @brief  Period elapsed callback in non blocking mode
  3.   * @note   This function is called  when TIM6 interrupt took place, inside
  4.   * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  5.   * a global variable "uwTick" used as application time base.
  6.   * @param  htim : TIM handle
  7.   * @retval None
  8.   */
  9. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  10. {
  11.     /* USER CODE BEGIN Callback 0 */

  12.     /* USER CODE END Callback 0 */
  13.     if (htim->Instance == TIM6)
  14.     {
  15.         HAL_IncTick();
  16.     }
  17.     /* USER CODE BEGIN Callback 1 */

  18.     /* USER CODE END Callback 1 */
  19. }
复制代码
  1. /**
  2.   * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
  3.   */
  4. void TIM6_DAC_IRQHandler(void)
  5. {
  6.   /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  7.   /* USER CODE END TIM6_DAC_IRQn 0 */
  8.   HAL_TIM_IRQHandler(&htim6);
  9.   /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  10.   /* USER CODE END TIM6_DAC_IRQn 1 */
  11. }
复制代码
Dingtalk_20211025095009.jpg
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2021-10-25 10:02:06 | 显示全部楼层
汇编一大坨,C就一点点,强!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2021-10-25 16:48:53 | 显示全部楼层
morning_enr6U 发表于 2021-10-25 09:50
硬汉大哥,最新版本的CubeMX,已经可以单独指定HAL库要使用的定时器了,不必拘泥于SYSTick,下面代码是Cube ...

谢谢回复,不过这个帖子实现的跟这个没关系,这个帖子不是为了解决时钟公用问题。

你这个应该是对应的我这个贴:

ThreadX的系统时钟节拍和STM32的HAL库时间基准都使用Systick的简单方法
http://www.armbbs.cn/forum.php?m ... id=99213&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-10-25 21:13:53 | 显示全部楼层
硬汉大哥,其实,我发这里的一个目的是,发现CubeMX在不断改良,只是他的路子和我们论坛的路子有不太一样的地方。这个ST芯片使用ThreadX的方式,在CubeMX上,越来越完善了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2021-10-26 00:34:02 | 显示全部楼层
morning_enr6U 发表于 2021-10-25 21:13
硬汉大哥,其实,我发这里的一个目的是,发现CubeMX在不断改良,只是他的路子和我们论坛的路子有不太一样的 ...

回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-6-7 13:59:17 | 显示全部楼层
白哥,一如既往的强大无敌!
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
发表于 2022-7-4 00:05:27 | 显示全部楼层
友情提醒一下,如果使用非ST外的单片机,SVC,PendSV,Systick不要调用NVIC_EnableIRQ(ST的HAL_NVIC_EnableIRQ对参数进行了判断,所以可以直接调用),因为NVIC_EnableIRQ只能设置中断号大于0的中断,否则会引起HardFault。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106661
QQ
 楼主| 发表于 2022-7-4 00:32:45 | 显示全部楼层
满地落叶 发表于 2022-7-4 00:05
友情提醒一下,如果使用非ST外的单片机,SVC,PendSV,Systick不要调用NVIC_EnableIRQ(ST的HAL_NVIC_Enable ...

估计是CMSIS软件包版本低,升级下即可
[C] 纯文本查看 复制代码
/**
  \brief   Enable Interrupt
  \details Enables a device specific interrupt in the NVIC interrupt controller.
  \param [in]      IRQn  Device specific interrupt number.
  \note    IRQn must not be negative.
 */
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
{
  if ((int32_t)(IRQn) >= 0)
  {
    NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
  }
}



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 07:51 , Processed in 0.278844 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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