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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / n- M" t, }# B
: {" Z1 G; j7 x! v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; l& v* B2 r, y) x# j% _#include <unistd.h>
  K0 F: \& h: e1 @- X#include <sys/mman.h>
6 o4 f, {& k8 {# G4 i/ q  N#include <sys/types.h>, u7 d$ W  s3 b$ T8 l: A
#include <fcntl.h>6 N. M: Y% K; N" g% G4 e2 g6 l
/ j0 t. V* ~# h5 M  o% r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ F  j4 m$ d- Z7 B
- E/ Q) T/ P" L/ z# q) O9 M
typedef struct
6 B$ c% s! a2 V) R! q3 N& @( s{
; X9 E0 C- A( _* r. n+ Y" L        unsigned int a;; N4 ?+ d6 S, i
        unsigned int b;  z. m0 X( k4 ]& p) I" f4 A/ G' A
        unsigned int packet_cout;
6 I! x8 i5 k3 K' Y* @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 _) \( J) i* x, }! M6 A
3 E( R" w. O$ @" X6 h2 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* N% i" L  T: C; d1 k
unsigned int count_copy = 0;! C" o( n* n) o1 a+ K9 ]

0 L& i( A. }! V3 \% Y1 y+ P: i
: r/ G6 T3 b2 U$ J" _# a1 pint main()5 V& P; q# Z. B5 N. a- h
{
+ S% P3 ?4 J2 m) `7 G0 s9 h        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 C5 s( Q9 P) ], l  a9 {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 C6 r: s9 a5 X
" M2 v7 j. h8 d5 ^, b
        while(1)5 x" U+ z5 }% o7 Q5 q: R! I
        {
7 j0 r/ o# B5 a7 H* J7 U                read_MSG_buffer(pshreRAM);  w+ ]% U! B' S
        }                7 X( Y3 q+ X; g* b3 ^& x! i
}
- p9 s+ F7 j4 K) Q
+ ]) ]) v3 {$ c1 P. N  @0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) T5 c3 y: s5 P2 i{
  ~/ N9 |' |7 O+ E' g        RX_MSG_PROTOCOL buf;' ?# s2 m1 G4 l6 @2 R
        ( i% }8 _% B) }* v& z; E% v
        buf.a = pshreRAM->a;# I) N& t$ z! U0 i
        buf.b = pshreRAM->b;
! d4 C0 G- f) A, U7 P: H        buf.packet_cout = pshreRAM->packet_cout;) B0 e, \5 ?& i! J! w' J9 W
        
. C1 m/ H8 r' T# O6 {6 J; k8 Q        if(buf.packet_cout != count_copy)' o2 [8 j. X/ V5 P' S( z, ?' v- D
        {
) i  U) T$ ^# o1 c3 \! f                printf("a is %d\n", buf.a);
0 S* t6 s& _, g8 [  m                printf("b is %d\n", buf.b);1 j3 x7 e. E, V5 u0 A
                printf("count is %d\n", buf.packet_cout);1 z5 ^/ c# v; `! T0 _7 j/ [5 X
                count_copy = buf.packet_cout;
, |" N) A- |% [: I$ \        }  Y+ d$ h) V( T; [9 U- j
        else" E" W# s: o9 n4 W) M
        {4 x+ k- Z8 a  E* F; \
                printf("No effective message!");% l8 c# \# h; H/ I
        }$ d, c- h" @* _$ {! @& J
}
- }2 ^5 W& [! l" ~
$ g! s. Z' d* w+ ~$ H, |/ Z) Q/ l7 ~/ p" \% f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ?6 g6 o: P; Z0 g, I5 L使用下面代码,对内存使用了mmap函数后:
, Q1 y9 r7 o9 u5 i- U1 @5 {* f#include <stdio.h>, y2 f! B! d8 p$ Y
#include <unistd.h>
4 x3 [% C' g3 k% p, t) r#include <sys/mman.h>+ v% s1 X+ r# S1 p
#include <sys/types.h>- q  w* u- @* E2 j# \4 F
#include <fcntl.h># Z6 U% K( v6 W3 z5 T
( U3 g0 a2 c# ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) I! {8 c) @1 J& R#define SHAER_RAM_SIZE         (0x20000)   ( v! `9 W/ M8 c( }3 L6 R
) j. Q/ f) a& H. H# x* {2 M# q
typedef struct* F: [4 m( E0 a! V9 P
{
* t* [0 G+ @4 W+ a! w4 P$ y2 o3 c        unsigned int a;1 _* F3 z4 T( `+ Z* l0 p" b
        unsigned int b;) a  a1 O9 W3 ~+ X+ _
        unsigned int packet_cout;
6 E. f, i: e- j/ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. J/ O9 I* s/ m: S! I, e
6 D( t$ O8 }+ a# D/ Lvoid read_MSG_buffer(int *baseaddr);
$ I. U; D1 {# N, D+ U- D! `# K2 m% zunsigned int count_copy = 0;
* m9 x- q+ c4 A, c6 r) A! m9 V% A; K) r. ]* h$ z% p
int main()7 z* B* u0 g9 i" _5 e" p2 l0 |
{, T" w4 b5 A. ~
        int fd;
( z' j0 g" G# {1 _& I3 V% h        int *mem = NULL;& b' z+ G$ ]0 D  Q1 I7 d) u

4 Q" ~0 R5 q# @5 i: w: x7 C% y        if((fd = open("/dev/mem", O_RDWR)) <0): [  t! L1 w' T# G4 y$ @
        {7 I7 J" q& U5 M9 t$ o) @( J# m9 H
                perror("open error");4 @& ~: R% d" W, Q5 T
                return -1;* O) B" C) D2 D2 K
        }
4 @1 q& V6 `# H- }; g9 a4 M        * n+ a* R' k8 E8 W: J! d9 ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) ^. L8 O, c2 t

2 `6 t5 V0 m& n5 L6 K& t" E$ }        while(1)' P. B& M" i& I0 s3 y3 S5 |1 ]
        {& W/ R: j3 h3 I/ L; C9 h5 r. ^
                read_MSG_buffer(mem);
' |2 x, }; s4 T# w- J8 U        }               
5 o" _4 }% H9 Z}
; ^* S5 J! G  j# O0 b0 n
- H+ a/ I9 N& u  K/ f& a( }void read_MSG_buffer(int *baseaddr)
* s0 T, l( b: p{
/ e- _7 w: C2 y        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H" H4 y. z3 d) ]- t7 b/ ]; I, i8 E. p
: r9 J; n- y+ g) ~/ p+ [8 o7 K+ j/ Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 O; @0 X" Z2 ~8 n. Q3 ~3 d6 X2 K/ x4 c1 ?4 b0 t
        if(pshreRAM->packet_cout != count_copy)
4 _* |) u5 k9 y( \        {
( ]! E  u. A# T; G- ]( q+ V                printf("a is %d\n", pshreRAM->a);+ f! ~1 |) V! M! y: B
                printf("b is %d\n", pshreRAM->b);
6 e/ ^5 {9 H( b8 h                printf("count is %d\n", pshreRAM->packet_cout);
' j4 o7 s$ b; P7 g( f$ K  i( w                count_copy = pshreRAM->packet_cout;
; h  ~. R2 @0 A7 p- j* s" ]0 v6 x* ]        }
5 B9 m2 V( s! I* O" U        else
7 Y7 b" m/ P6 c: @  K! U/ o        {" Z7 F" S$ c$ C7 t3 B, A' l
                printf("No effective message!\n");) p. H8 l6 F' L' Q; E
        }0 q. z4 n3 n9 l+ D) D7 Z' N
}
# J7 R: \. H9 q. j$ t9 j: w0 e' q. {+ U) t; H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ h3 B3 n. Z6 c9 C& z% n
9 U) ?# P$ r! I' p1 f% D
( `) V* H% U% h7 G% R2 q: c- k

- [2 @1 T& a% {' q' e# ^* \4 `. l4 t* x8 C+ P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-7 09:55 , Processed in 0.040930 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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