OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: @( A4 h5 m2 o% K( j0 v" _& R6 R! Q7 P( R6 D! }, @# {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 V( P* ~$ P: I5 x1 R
#include <unistd.h>2 X; Q- v/ g' p
#include <sys/mman.h>
9 D! `; d% W+ [#include <sys/types.h>3 w+ k% {, A. A, R. ?# f* R
#include <fcntl.h>0 _; u$ C3 W% b% U/ U9 q
6 b" [+ a5 h$ e, ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, `2 z8 w9 W: H: q+ I% g% ]% ^) P6 a/ x
typedef struct; J' g4 y/ ~- m+ f/ v, H( U
{
1 c5 X' G5 o  p* C& q7 s; `% b' P        unsigned int a;
) N# Z- R8 }3 k8 a        unsigned int b;
$ o1 N( v" M' A        unsigned int packet_cout;- K; U9 z" u. C& I$ D. E1 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ Y4 @$ ]6 b6 n" j6 t7 P5 D
8 A* N+ ~5 |" f: w/ S3 |: pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! ~' Q3 B4 L- A  I
unsigned int count_copy = 0;6 [6 O2 ~3 ~" @: B

' d* s! b" r3 Y7 Q- o! C% _: r- N# _3 H! a+ Z( \5 N
int main()( F4 d7 f: K) X
{: _( z7 p4 H  M) w
        pRX_MSG_PROTOCOL pshreRAM = NULL;: [) i; M  E: }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) f/ e  }2 C+ S) X! N7 Q4 L9 w

* H) N* g# O. m9 Y: m5 h8 @        while(1)) b" H. Q. y7 I3 `7 P! k8 B
        {, b: l. O" g! u/ O2 i+ B
                read_MSG_buffer(pshreRAM);
9 Z. R0 ~7 `) @% m8 a0 \2 p        }                ) J- y! ~0 }/ S9 V" q2 H
}$ c- C, q: y# x) ~
2 r0 C$ T2 J- R" M6 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): Z& w, Z) w( q, Z" f
{  u, ~, Z# i6 W. O
        RX_MSG_PROTOCOL buf;; A& ^0 E$ r. m. V$ ?; m, K9 e
        0 C4 R9 V0 L- [; ]" z8 _8 d
        buf.a = pshreRAM->a;8 `' m( W1 e4 E2 A. v& E
        buf.b = pshreRAM->b;- `& D% b4 C7 r
        buf.packet_cout = pshreRAM->packet_cout;1 m& B& s8 W: j" ^. q3 h3 }
        3 V4 ]) ?, I+ ~# ?; ~& e8 q1 \
        if(buf.packet_cout != count_copy)
! q; z# e+ A' F# C        {1 h2 z3 P  z/ L# s" d; d* T% ~5 o
                printf("a is %d\n", buf.a);
+ E( U: E4 T  w: k! s% j2 c                printf("b is %d\n", buf.b);" G$ p! h* J2 [- Y5 m) R" |% y, Q4 b
                printf("count is %d\n", buf.packet_cout);. N: I" ~' v- P& h1 g4 v& U3 V* \
                count_copy = buf.packet_cout;
0 x( d5 A& d+ l2 c4 A        }
5 ?7 s% B2 [' E- u        else" U( }: d1 C$ a7 H4 ~' `
        {
# ?4 D% T5 W6 S; u1 k* e                printf("No effective message!");1 D, _1 k& U4 g
        }! j+ i  m' |! I" E4 m' m1 @  A$ x0 k
}
: f! d. K0 x, A' y" L' {. ~) T9 m8 i7 }0 H
+ S' H+ a) B( J. }% Q2 N8 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 e% y7 V% S/ C2 K9 i; M使用下面代码,对内存使用了mmap函数后:: u0 p; H1 p9 X8 t* d+ Q9 s6 d
#include <stdio.h>
* A2 ^: e, O3 u#include <unistd.h>4 z4 M7 ^+ s6 R- T7 s
#include <sys/mman.h>
4 n. [8 T- ^* P6 _#include <sys/types.h>
$ l( n* ~" d* ]( i#include <fcntl.h>& y8 F/ J) v# x! ^4 Y
) ]) W8 d& }% S  f  o
#define SHAER_RAM_BASE_ADDR    (0x80000000)# x% p/ d: K  y
#define SHAER_RAM_SIZE         (0x20000)   9 A9 }4 r9 o/ P( s8 b

4 _- c! Q" W- z/ a7 stypedef struct
" M7 e+ N7 D+ ^1 I! \" x  g8 y' C{
+ V: \$ O7 a/ j. {) p, o( Y7 e        unsigned int a;
+ O/ Q5 G# m+ |% D7 @- ~8 @0 I        unsigned int b;8 b, C( U) H& d9 A2 S/ H
        unsigned int packet_cout;
! M! ~3 z8 C  t6 t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) t% p# [5 S% \8 P& v# X2 L
4 g" T9 {0 _) R5 s2 G  t
void read_MSG_buffer(int *baseaddr);6 ^7 t& ]  z1 V& W3 C: C6 ]' a; Q
unsigned int count_copy = 0;9 n" ]0 ^- d5 ^: a: @% Q! I0 y& [& F

" \' r. C4 u2 j7 C7 Y9 p) [int main()
- G1 g# \2 |' {4 U6 z, ?{
4 f( J, `5 X6 I( U0 _        int fd;/ W5 W; }8 ~+ Q4 [2 x
        int *mem = NULL;) b! {: t0 U& W& V7 T3 B: |' [

+ {. m( W1 n7 _; ~) y1 c- a        if((fd = open("/dev/mem", O_RDWR)) <0)
$ X8 h$ h& {" b) K' u; B" C* e3 q4 K        {6 g# t1 N8 a' E) Z% u: F) ~3 R
                perror("open error");9 W( X1 l: G' j' b' U5 t# p# t
                return -1;
# K* E1 F7 d+ i+ X- G/ ^        }
3 ^1 P6 P8 e* b5 E1 x        5 ]/ [/ }1 |4 w. k/ x  o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: _, q( e" n9 ?  }: R8 n: U5 _! R" A) d
        while(1)! y# B% q9 T) ~& k" _
        {
( Z0 j+ B% g. C6 C9 U6 Z                read_MSG_buffer(mem);4 Z9 y+ a" f6 ]  O' U
        }                # p/ }4 J9 C9 s. U( C
}0 J. u6 t. o2 f9 ^6 M
( c! \/ n- r* i0 R( o
void read_MSG_buffer(int *baseaddr)
, D8 i; |5 j. m/ p/ y& ^{
2 h7 G4 |( j5 ~7 G        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 q- T5 V# m% T* [) I6 i! N- `) v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 l% R+ Y$ {  C6 R
+ i; _5 S) u8 d        if(pshreRAM->packet_cout != count_copy)
$ }2 z; ^+ o% e/ [6 o        {
) [3 g) i0 X- w# ^, c7 R3 ?                printf("a is %d\n", pshreRAM->a);
) O! x! i3 V* _. x                printf("b is %d\n", pshreRAM->b);; A2 f3 w+ W; m. _8 K; n
                printf("count is %d\n", pshreRAM->packet_cout);% l; P, J  B0 U" u% ^3 _
                count_copy = pshreRAM->packet_cout;! h: g  |9 u( l2 t& F. e
        }
* z, n. W/ D6 i' L, [2 ]        else
; I0 K' Y- ]. ^9 C% ~8 S  i, B: q        {
3 U0 c( [' O8 @) k/ ^                printf("No effective message!\n");
) ~; [4 E& K3 p6 ]7 p        }
+ p! I% i3 j+ L0 c/ U; k2 k0 ~" S}0 i5 L5 w8 j# S7 k$ m$ i+ [7 S
: O% n* H* W+ |1 X5 r# ~$ C+ E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# K9 O8 y( q; v* k
, w( {" w4 |% E2 U

1 _0 Y6 J& f9 [! O- I9 F+ `, F; g' ~) N4 ?9 j5 Q
0 Y! p+ G* f% T% i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-9 13:19 , Processed in 0.042209 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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