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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 P" E2 f2 F: j; {! E3 i2 z' b
- u$ @3 u. N8 E. [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ V: b( Z) L, |6 G+ j0 O, x
#include <unistd.h>' @6 U9 z( }+ B3 J
#include <sys/mman.h>: A7 @( C+ r: _. e/ R
#include <sys/types.h>) Q2 g& ~* C2 J* t9 H
#include <fcntl.h>& \- v. e  o- N& f6 l% k
. M+ j; `1 X6 D, W( ~9 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 `+ S0 T% {. [! }- I. e

3 k" n3 n" A% m/ Wtypedef struct6 k3 H( X7 ?, L
{
5 ?7 j* n5 a2 m  X4 ]        unsigned int a;4 s9 @9 |  L* t) n. p
        unsigned int b;
+ x- [9 q( d- k2 c+ I: L        unsigned int packet_cout;
! R. Q. N& n2 I/ D! E; S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 n. U' |& k' j. K: t, G# }  M- y( B
4 x- i4 D: Y! {. D6 `2 E: V4 d3 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  d/ n! Z+ x) Q- U# f0 t2 b* L
unsigned int count_copy = 0;! Y7 s( t. ^* D  u! ]& q
7 K3 {" n7 @& e7 e
& _. }, Z2 L, n9 g
int main()- ~. ~! B$ _5 o9 ]* J
{6 z. T2 {# h6 s+ b* M. K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 ]5 W: l, g" k( B. J( e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: x( N8 b& u  D- j+ P! c$ l8 C$ s) F" f# B* Q) c
        while(1)& U" i- j7 `9 V8 E# {4 K
        {
8 v( A* n; _( c( p% V& Q                read_MSG_buffer(pshreRAM);
5 W. p5 r. R. m: I' W4 t        }               
: M$ N+ Q' M2 N4 s4 ]7 `' H8 j}
2 [4 \4 Y2 I5 I1 a7 l* y9 @( l
4 ]/ N7 q# ^) e2 \# s( l! S# l1 zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ]. }# z& T' J1 O$ E7 B9 V
{# \! b8 ~* U2 z* d: K( H8 m& d
        RX_MSG_PROTOCOL buf;
' c' O0 m$ `7 P3 x8 \! h% L        , Q" }7 F/ C) [, R# Z
        buf.a = pshreRAM->a;% m1 W. W) t7 M4 q3 {' c
        buf.b = pshreRAM->b;4 b! _9 b- J1 h8 A% X
        buf.packet_cout = pshreRAM->packet_cout;
% E3 ?5 E7 S; \; o7 _+ j        
, \/ X' S* `6 L: B' z) l4 W- V        if(buf.packet_cout != count_copy)* y+ D. O  o* X( ^
        {
1 V0 t+ X" Y& m8 E0 M: W  ^7 v  s7 }                printf("a is %d\n", buf.a);3 N2 `, ~& C3 u  Y- n: [3 }0 k( h
                printf("b is %d\n", buf.b);
' W; @% y1 e3 U4 B# D7 m* k: ?                printf("count is %d\n", buf.packet_cout);
/ u7 p7 d# X( }# u: h. n- ^                count_copy = buf.packet_cout;
$ j: w- H0 c1 \% s. U) Q        }) d1 ^+ d# U6 c( R# F
        else9 ]. ?! ~3 Z/ O; @" V
        {
* U- t- _  j! m& P$ W- k( l                printf("No effective message!");0 f. ~2 }, S" A9 }2 ]
        }% H) w5 W/ Q) y) A& a# u  A, u
}
/ A2 s; \& ]% Q! L) [# w$ e+ j3 a, A/ A! h  |! `; O
$ j; i6 D. U" m* J" _# o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ }. X8 q- V, j' F; v& {
使用下面代码,对内存使用了mmap函数后:
6 @, \" o' L" w0 e" L#include <stdio.h>
7 y6 b# Q. u2 L  v#include <unistd.h>) @, {8 M9 ~. u  M- Q" ?% @1 j
#include <sys/mman.h>; q$ P$ h! w1 i+ T
#include <sys/types.h>
, S- |" {8 z; @9 N) l#include <fcntl.h>
3 k5 z2 N8 J  W2 x- j" O, K' }$ t" p, q* v# \* T8 D, Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. j& `( }, D, _+ m+ {3 N#define SHAER_RAM_SIZE         (0x20000)   
% w/ M, H$ C7 m" N3 g2 b) i% H9 u% r0 T) S; B/ g
typedef struct
4 O6 H! B8 v! O2 q% B' {' r2 \9 }* S{& `, }2 }2 V: `. i7 b' t" Z; X
        unsigned int a;
$ k+ g5 c: `2 H, ^- ~! ?4 a' l( h        unsigned int b;  j. R3 X4 q' w' t) E; A& I
        unsigned int packet_cout;
# t; p; \; ~$ X7 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ T: j. {% r- E

) w# B1 n8 Y( H4 ~: ovoid read_MSG_buffer(int *baseaddr);* Z) s5 g  m! q% s0 U' Y- }
unsigned int count_copy = 0;
" G8 a5 N. O' ]/ i# Z8 j: ^; T9 V  m  E
int main()
0 t0 D/ }) N. R8 P! f8 d; b{
7 u3 i' y5 l) J" I        int fd;
. U  I9 J+ v1 H6 G: j6 N4 o        int *mem = NULL;2 J# j+ o( z* A* @
* k  r; M$ D/ k
        if((fd = open("/dev/mem", O_RDWR)) <0)
. ~  D* p1 p7 o* A6 w2 i/ I' i        {
4 ]9 m! O9 P& J                perror("open error");
  _! C. n6 v9 c- y7 r$ z                return -1;1 H) J& t2 E. V" C. B4 A
        }
' p+ x5 a$ i6 Y, D4 {, }8 t' Y        
2 y( E8 m2 S" e9 e  I1 t1 v2 m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ k/ i, o: j: ~! v1 U' k2 z
, C0 m3 Z5 U: h) O  a0 U        while(1)
# ~( U) S" S/ Z: `4 W1 V. s# v, h        {" C# R  g# j4 U' I
                read_MSG_buffer(mem);
. I2 X4 \, r, F+ l- u1 c% n4 H        }                / s, m  s  [' c( T6 V
}
+ _# P! v% B9 i' Z6 e* S' E9 H) b# W# [
void read_MSG_buffer(int *baseaddr): X: K+ i. q3 f+ {. h* R
{
% }! b5 P# h+ V: p9 A7 f        pRX_MSG_PROTOCOL pshreRAM = NULL;
& Z8 F6 P: i. [0 ?- F9 `
6 U0 {' q: O- R2 ^+ T) r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* w& l8 S' G( X/ o2 _
; A" Q7 }( U  ^0 d! ]        if(pshreRAM->packet_cout != count_copy)& ?* l" B4 B, p; r; F4 D) E
        {/ d" L4 Q# w  ?; p, V1 o' n3 \/ f
                printf("a is %d\n", pshreRAM->a);0 y8 Y8 p2 }# W: D; @7 `
                printf("b is %d\n", pshreRAM->b);- C, A4 H% m$ N
                printf("count is %d\n", pshreRAM->packet_cout);
: D3 H" c: j& E! U  P                count_copy = pshreRAM->packet_cout;, @! x, a( ?" ?9 W
        }
/ Z; o5 r6 |6 Q/ O4 C% W        else0 a, p- K8 K5 c2 r* n- E
        {
6 {7 u: S4 B6 w% o; P  t                printf("No effective message!\n");; |8 f  B( ]& u. }: G* e
        }! \, A' Z( L& P5 ]; w+ C  C
}+ E+ o6 o& p4 C* I

! P6 n0 M% E0 D  o$ F, I9 H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" g% \" ]# V! j3 h; |

1 V6 I2 u! S: c0 B$ r+ X. `$ e! }6 S/ L: m0 {& D$ s5 t5 N  ]
' ^" ?0 W% Y. _

0 }0 F0 l; o4 ?! K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 02:33 , Processed in 0.039683 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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