OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5378|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ^$ F* `0 |7 R- |# Q
( c# K$ m, C: \/ v2 m6 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; C+ g# w7 ~0 T" Z) Z8 A
#include <unistd.h>, J1 {# C- ?2 x2 n
#include <sys/mman.h>  t. X' O& W' L% E3 Y/ a- L/ a
#include <sys/types.h>
7 K+ G& _: |- u% p4 `#include <fcntl.h>
' c4 T8 E" f7 ?5 \/ `+ n- N% E7 v" T) f! H) F) K
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& X% f/ Y" D9 b% u0 K% O7 T& }
! E: g4 F* ^  G) rtypedef struct1 K, W! t* a: w4 O0 Y6 m
{: v; W7 \$ X3 Y+ e& l" v
        unsigned int a;
1 D- E- Q) }* h2 z* ^        unsigned int b;
% z, K+ t# ?* J0 a$ P        unsigned int packet_cout;+ Z! u3 n' s: p6 t* O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& a7 R8 {0 w' @$ \' E# K

1 w: i2 h0 n, x0 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 T! p/ P' ]4 `3 _
unsigned int count_copy = 0;
; @8 w2 w. G! Z. m  S# A  o
- _/ B' G, `+ x. K/ s( x9 V
, c. S4 i1 S  `5 S8 S2 Lint main()8 I, X2 ]' x5 f+ c% ~8 \. U
{
! l% v9 X: R* a, z. ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 }& I; P" ?* q6 ^7 d$ L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: C: {; k0 j" n- A- n5 K! I1 l5 P" w* N% S) i# F
        while(1)
% W! [* Y+ a/ Q        {3 ?$ d( t0 q4 C0 g$ y2 ~+ R
                read_MSG_buffer(pshreRAM);$ ?7 N  O/ e/ Q0 ?8 X
        }                . d0 e) N. j$ _
}! x0 k; D& K8 ]& M+ S) j6 X0 E4 I

  [7 N0 K7 }2 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 `6 n/ |4 n% b, m% T9 E( m# M{3 }8 b: K+ |8 e' f  j; ^. a
        RX_MSG_PROTOCOL buf;2 d: R* u% g4 _/ O! m9 N
        
) m0 w+ Z0 Y! y2 S2 x        buf.a = pshreRAM->a;
- n8 z  B, C1 U0 K- Y        buf.b = pshreRAM->b;( B7 w" t6 ], v! ?2 a
        buf.packet_cout = pshreRAM->packet_cout;" B8 I4 m$ l1 y0 `; A5 Q2 z) D
        
+ [* F0 E3 m- s        if(buf.packet_cout != count_copy)
, [/ L& G; y+ ^* e' g        {
5 b: V5 v- P: \2 D7 x                printf("a is %d\n", buf.a);0 X( e* j2 r8 I2 p3 Q
                printf("b is %d\n", buf.b);: @' B& [7 {/ p' c$ ^
                printf("count is %d\n", buf.packet_cout);. W) ~5 ~* S8 C9 ?9 d+ A, }# q
                count_copy = buf.packet_cout;$ b  A& Q, }) _
        }
- M% H: s6 l4 W% \$ u        else! ~/ R& r$ d0 f3 T+ p
        {  q/ k! D: g: z  q; ?
                printf("No effective message!");
# ?. P2 ]# {; f9 O        }
  ]6 b' |5 x/ l0 `0 s}8 ~$ b9 ~/ W: x4 i1 G
% r/ C( l* |5 W6 @9 O! y' g+ |

2 T' B/ F* O9 K; o" }; P& P- ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ J4 \3 u) x. ~1 A5 M2 r/ w+ o7 y使用下面代码,对内存使用了mmap函数后:
. d8 ~+ s9 T1 h9 {* i: \4 |# s#include <stdio.h>
( W2 T  M, l- ^: N* v#include <unistd.h>
( T; v' b+ x! Q- y3 v! B#include <sys/mman.h>
* V* v7 L! b! w+ O6 c#include <sys/types.h>
  B  e1 O, |3 S& t- L#include <fcntl.h>
* v, [) ?5 T0 m0 {1 Q
0 p+ z/ Z# B' X6 Q2 H#define SHAER_RAM_BASE_ADDR    (0x80000000)% N% b+ H% F. x: ~5 \8 B" e
#define SHAER_RAM_SIZE         (0x20000)   ! [4 \) d) o! l1 W* S5 R
8 S' G; O" n  ?3 ^% c1 Q) H
typedef struct" ~, V4 ]$ h' d3 d: Z
{
2 E4 ^! l+ @% O0 J, h8 y# ]; \        unsigned int a;4 Z7 }! _7 {/ R3 @
        unsigned int b;# l6 Q/ S8 s, t. U* C: K3 C
        unsigned int packet_cout;3 [% F$ V3 S7 f: ~' c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 v5 h7 T2 M, J  ~/ h( j
0 m5 r3 O' N7 I4 g
void read_MSG_buffer(int *baseaddr);
1 m# c! a* @! r" ^5 munsigned int count_copy = 0;: {$ [- g! ~# S- B. Y
( q- C) C: {: i% m% i0 U
int main()" R4 [7 V3 L! H: ~/ h( ]# \
{
9 K  r$ [% M' N$ k        int fd;! _( o$ `: X' O; t* _3 f
        int *mem = NULL;2 Z: ?! b! f6 w/ |
9 H: |5 d$ F5 Y" h5 j
        if((fd = open("/dev/mem", O_RDWR)) <0)' \! t+ q$ d' }5 _
        {
8 n$ _, h  Z4 _& l1 O                perror("open error");
( M: \6 m6 t5 b$ x* a  B2 i! L, m                return -1;1 E) n: `) @, ~2 D4 @7 j! i5 W
        }! ~) Y- K. ]$ B6 s: Z9 ?, V6 ^# f
        : N( U. I! x6 }' V9 Q5 W/ \
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 {* s  A1 O% h6 l6 @' W# h; W9 O1 e5 N/ G2 Z- w/ k2 G4 {: [7 @! F. S! d
        while(1)
. x# V8 F6 f1 L9 Q0 Y# p        {
, V0 i, {" M( b* l1 Y                read_MSG_buffer(mem);
3 a% Z- M+ `# p  K        }               
/ k, o3 X, e; i" ?8 I9 \}% Q% N% z( s) c, u
. q3 V( x6 r( u( n! z( [2 m
void read_MSG_buffer(int *baseaddr)
) W  T5 F8 c' c! d9 J# m- U{: x, x+ z2 `, S( e
        pRX_MSG_PROTOCOL pshreRAM = NULL;% R' Z" m; [! P- ~' w7 `9 o- D5 \2 A5 a
8 T4 l/ J3 V/ y0 @3 n+ _
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& K  G1 p' V! Z% Q

+ y7 r6 e5 G% g2 g        if(pshreRAM->packet_cout != count_copy)6 {" j- i  b1 {
        {
# z! U7 I% O3 V1 H                printf("a is %d\n", pshreRAM->a);4 H: p6 C3 T& _( [
                printf("b is %d\n", pshreRAM->b);
3 m- O9 N, K$ Z                printf("count is %d\n", pshreRAM->packet_cout);
4 y+ w2 \& E! u' Y                count_copy = pshreRAM->packet_cout;# p0 |2 @5 B4 y" ]
        }- Q" \+ l. g6 f1 Q
        else
* L, V; p. q7 `5 Z6 H$ K0 N        {+ l; L1 o3 H; ~( Z
                printf("No effective message!\n");7 J$ N! L+ b* W
        }! N9 O1 d# e* n! V0 X( `0 h
}3 Q: Y2 n: B( [- X3 z! N

; B/ T  j2 \5 v" h( r; W9 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* G& _8 n0 p* q, T. S' J  ^, p& k

+ D" B5 R" p9 z" N  u. q! T8 L  u8 y# r
/ C4 t; m" G4 r7 _2 P/ v9 J

* [. [3 S, r/ I0 t$ U+ v6 x8 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-28 02:30 , Processed in 0.045097 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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