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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 ^+ t' {* L4 V* ~
3 p1 z8 g8 S- V9 J5 ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 k: U& L( ], N! A" h! `, u#include <unistd.h>! P3 s4 y1 ~8 E5 W( y7 J3 a
#include <sys/mman.h>! Q% s( F% V. m3 k4 ^4 q
#include <sys/types.h>3 w3 O/ [1 W; t6 @3 R, J7 G; J, W
#include <fcntl.h>
  K# ^  @5 a, q) i7 q
: Q) @1 _1 v* q( U+ ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 M; l) X9 k$ T( Z  s$ }

. H# ]  ^5 I) ^  @typedef struct* d, y, T4 ^/ O8 v  W
{  R1 W' O2 i6 \0 p) H7 b1 F* K
        unsigned int a;
) ?( A# _& T* p2 x0 R, ?6 C        unsigned int b;
) _  ?- E! t5 m7 |1 j( R        unsigned int packet_cout;7 D. x3 j: x+ e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) m) \% X( R! K* T4 q& y

2 s; d4 k' x& w' L; Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 m- J$ d8 k) Y- v) Eunsigned int count_copy = 0;
$ |/ }( B- V9 Y" R6 d& g8 F8 g6 q% ^# t+ X

$ D! |8 p0 I1 S7 S0 K% t' u, Bint main()
2 A' }/ j# w3 j$ Y. y) {{
1 e$ m5 ?9 l# z; a' b) B; u5 `8 g! a        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 V9 K5 X% @2 {: B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& R3 V6 T" ^4 S% R* j9 a: @, ]$ K7 T! C0 w3 @% Y& P+ t
        while(1)
& Z, T% i7 i5 z9 r$ [* J: O. U        {
$ F* w' E: f5 ~9 A  n# m                read_MSG_buffer(pshreRAM);- N5 @( D4 g2 z% q
        }               
0 t* v$ s" L' N! V" V& p}
; V: j3 e" G% r% x
) F) L; O# F' i2 G4 b/ ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 ]3 s  f" f( L" G/ _{
4 j/ V' ~; S  u- r/ ^6 z! Z        RX_MSG_PROTOCOL buf;
4 S" w* f) L- ~7 i: t1 Q4 F: u' ~        ! T4 U" E2 q5 S* [$ R
        buf.a = pshreRAM->a;
( ^* o+ e/ |/ y9 V+ Y' ]        buf.b = pshreRAM->b;, {% _- N* @- ^) G2 b7 A; p
        buf.packet_cout = pshreRAM->packet_cout;
" {. ?0 T1 S3 h4 t  z        1 q0 Y- J! y: S4 k/ o: u* Q6 F6 F. Y
        if(buf.packet_cout != count_copy)
0 I( v! _" L. a* [) i7 Q        {7 x: Z* I9 `( H( y7 z# U* J9 }
                printf("a is %d\n", buf.a);
" C6 d, q2 d) i( G                printf("b is %d\n", buf.b);
: ^% E; D) T  F" J7 O. q                printf("count is %d\n", buf.packet_cout);( b: r# r8 ^  D3 i$ M+ V
                count_copy = buf.packet_cout;: l7 x8 P! e7 f: `% q( L
        }
6 J4 d' j( h3 r; g        else
2 |  L, w) i2 \6 `        {! m( R3 t) f# o1 A3 P6 `% o* z
                printf("No effective message!");
' L" L2 f( t% c- C+ L$ Q3 o2 @        }% u% o! _+ r5 ?  r* d. {! r8 j2 e
}  F, V$ q# _( J: `

2 @- s/ [9 g& Q: V8 c
: y/ w8 m( k$ {" n' [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 Z& K( Q, Y% X0 x: w使用下面代码,对内存使用了mmap函数后:
7 B: z, l7 _# E- R( R; d2 L9 u#include <stdio.h>' k! a; `( {9 o3 N: y$ s+ b
#include <unistd.h>% \# h# G7 B4 q( n( M8 X
#include <sys/mman.h>: N/ u, X: E, C8 ^
#include <sys/types.h>
, M! X! ~- u9 N& J#include <fcntl.h>
( E5 k* }, C* M0 x# i
. [$ l0 w# K- p#define SHAER_RAM_BASE_ADDR    (0x80000000)' h2 t3 K. I/ O* M
#define SHAER_RAM_SIZE         (0x20000)   ! C/ \2 E$ H# ^' l# c* z) U

! g/ x( z: ?, p% W6 Ztypedef struct
  e5 z: Z) f6 Y6 q{8 S5 ~/ J) D$ Y, g: n1 ~
        unsigned int a;
9 l6 E0 A4 E$ f  \& y" u        unsigned int b;5 X7 g, l& [7 I! s$ C
        unsigned int packet_cout;4 W. ^& \  \& d$ q' q3 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: ?9 z" h* ^- u* f8 [( U) f0 T$ P, P/ L0 K
void read_MSG_buffer(int *baseaddr);9 M7 {' R+ [  r9 J
unsigned int count_copy = 0;9 [2 ~: c% K" t% [9 G
6 U) O0 B1 U9 ]& b& G2 k
int main()
/ F# T; ?0 C" R# U7 @* r+ ]  L{
7 W, s+ t0 c; F; F. l) u' W        int fd;
" w9 A5 h4 X9 @3 n4 \: o; h& B/ v        int *mem = NULL;
% w7 k. {4 U: z- }. U! `+ A" D" e0 B! [
        if((fd = open("/dev/mem", O_RDWR)) <0). }! U% r' G; Z0 ]* ~9 a
        {
, a. ]: B2 j. m- `' p9 y+ n  n. P8 H                perror("open error");
6 e! W. g8 f$ I6 U" W                return -1;
& S! x: Q7 e5 u. c' h" R! v        }
2 E9 z/ h5 b  _) X0 V6 q4 I        
- J$ r+ G8 L4 W2 V4 h) @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! r. G7 A5 `' [: @3 a% S; ?3 E# y1 ?% L
        while(1)/ C  w( f6 e& k2 x
        {
5 e3 t, i1 i1 N, j4 A" p                read_MSG_buffer(mem);  K( X! }+ n% v+ G
        }               
, C! D1 F5 H3 y* m5 n}
  u* v! j6 Z. C! h2 Z; N' W9 c" q- t: q- J5 d& g
void read_MSG_buffer(int *baseaddr)6 {8 a5 a8 J7 X% ]+ l4 \  F
{" y6 e+ q. [) G! _
        pRX_MSG_PROTOCOL pshreRAM = NULL;# M2 o. |$ e: G& h. ~/ {

3 D( I" c& `9 @  P" V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ h: @, J: g- C7 c7 q. `4 o
  m+ I" j, D( _9 P5 W5 a+ t
        if(pshreRAM->packet_cout != count_copy); ?/ v" U6 y; e6 h
        {
( Y2 T, u! J, k& ~                printf("a is %d\n", pshreRAM->a);. o2 m5 V  d  n, u+ s9 }
                printf("b is %d\n", pshreRAM->b);* x3 O/ @/ o+ x3 R! Q/ Q6 X
                printf("count is %d\n", pshreRAM->packet_cout);; z9 K' A/ n" e) m. J: ?
                count_copy = pshreRAM->packet_cout;3 X9 {& ]% ?/ y2 n  Y' h
        }
; N: W% j) d6 _, W  G        else* d. h$ ~' N  J9 j' u: M% s- ]' i
        {0 G' T* P5 G4 }$ m8 p0 f6 S* a
                printf("No effective message!\n");  k9 q8 _. T$ t
        }# \3 @/ o0 }# M" X" V2 O7 O  ^  l% G
}
' s/ z  Z- e+ o( g6 |
* a1 \$ ?3 C% h. \: _; j0 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' Y1 |- H7 I- o# Y! S

$ H' A+ Y4 ?  Q  P: S3 G" J& E9 y
0 F5 I% {$ {8 C/ y( k$ b
6 e  V2 U: H% R& V; Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 12:02 , Processed in 0.044536 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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