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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; f1 m, a5 {6 ~0 A2 i2 l7 G; ]+ a8 ~& u. |- q; j  F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 X4 M0 J3 X! W6 U' l0 Z0 ]
#include <unistd.h>; Q) A& b/ x! z$ Y6 Q
#include <sys/mman.h>
2 e% h- |1 D4 G* o#include <sys/types.h>
. N, l4 M1 o2 p% \- X& f#include <fcntl.h>6 l2 D2 F& m' I" O

( m' p6 P( ~/ w#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 |: f" {0 S& R% o/ b, r, f1 D) o: S  S( Z
typedef struct; B2 r% U4 `0 }* }* A3 J6 W& Q
{
% w) D  r$ q# N( v- \$ T        unsigned int a;& X% H) W$ r5 K& Y; s
        unsigned int b;
; q; w) h/ _, s( K, c+ E6 X: h! W8 v1 E0 }        unsigned int packet_cout;
% C/ {; _" O- O. R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ^+ f1 Y+ R# w* @2 @: b& P7 @6 a4 C5 P) x! z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ V7 V; V& C0 H1 E
unsigned int count_copy = 0;
& Y' {/ H! v: s" f3 ~
' \: l' Q; W1 q. o- m( q- I7 r. q5 ]
0 A+ ]( Z# h# jint main()' c+ z/ i5 n; r  M$ d! H8 E9 Q
{  {0 x+ N9 Q: C! v/ m) I
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 r7 S- C, l' R. ^' N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; p' Y  r3 k- k, i( H( K& P% o+ T5 X2 u" \- R" v
        while(1)
0 B* O& n+ O0 N- N/ q1 r        {6 ~$ N: I; r7 l* v
                read_MSG_buffer(pshreRAM);
# T% _! e4 `. o) i, ~        }                / w3 d6 p! o& m, g3 K; R$ z
}
! r6 ~% x; I- [* S4 _! b
0 r  F: c: A3 r$ cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 f, ?* D* F, r0 }! h  M
{
1 H/ U# D% b( `0 ]: Z4 `        RX_MSG_PROTOCOL buf;
2 a% N2 I% q3 v' S2 B" U        + l: X8 j: f( s& t, ?
        buf.a = pshreRAM->a;
" J' i) E: {: Z) F5 d4 ~' V        buf.b = pshreRAM->b;$ b6 J! `( q& [+ \6 X' a' x7 ~! R
        buf.packet_cout = pshreRAM->packet_cout;
. w( K+ u, F1 k* d- V" }  b# Q        
7 v* B6 B+ P  W. m- x5 i        if(buf.packet_cout != count_copy)
7 P* u% ]7 e, Z7 h, A        {
0 |5 k. L, P1 h2 }: i! \* `                printf("a is %d\n", buf.a);
5 D0 x. K9 y$ o" @3 B2 K! F                printf("b is %d\n", buf.b);
$ L& ~5 j9 H! S: ]                printf("count is %d\n", buf.packet_cout);' H/ ^# h; e- L1 C9 R: z$ [* B
                count_copy = buf.packet_cout;! \. }- `. o* E' W
        }
9 n' T, L: A# l* D+ ], K        else
! d5 f0 C0 ]* ^$ h        {; ~* B  ]8 t  ~" j- Z
                printf("No effective message!");
3 |+ Q/ t/ S5 t$ r) Z2 o  N: f        }% x  C" j' P4 q5 \  G0 {
}! _  x5 Z, v" Y1 o* ]  ~
3 b1 ~. B$ L$ }; n; h9 ~

$ p6 |" ^6 ~: D' z& G0 I! D2 K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; I3 k' q3 Q% h3 Q( A, |
使用下面代码,对内存使用了mmap函数后:. r% U% f6 M8 ]6 q
#include <stdio.h>, x' H( ]$ D1 Z1 \" {! M
#include <unistd.h>
% z' i$ f; V  R1 G7 t1 X# n* ~4 e#include <sys/mman.h>4 H" o. s+ C; N8 f! R8 j; H1 T
#include <sys/types.h>  W* s1 A$ r& g# R
#include <fcntl.h>* A4 j" q- W* t$ G

9 B, Q, g* @/ d+ s#define SHAER_RAM_BASE_ADDR    (0x80000000)& r! Q$ n# j' a0 @
#define SHAER_RAM_SIZE         (0x20000)   4 o5 S. d! b% j  i/ m" u; m

5 s. P& w, o  z( ytypedef struct# N. o9 j$ s4 Z& z" N0 D
{4 M& r  I- q7 c( n4 g- V
        unsigned int a;
6 a  c7 e- V; x4 V# _' w        unsigned int b;8 \. ~6 W3 {: E
        unsigned int packet_cout;5 D) I* B3 P$ E$ n5 h. c+ u( R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) r* u/ R- g4 v) U
& w; ^5 l. `6 ^1 m0 N
void read_MSG_buffer(int *baseaddr);* L+ p5 w( p/ f4 U$ N5 C
unsigned int count_copy = 0;
! p$ x: Z8 ~0 T; R! g* R( M' J( [* y0 i$ W9 i/ _) p4 ~* w9 ~3 N
int main()$ n' _: p: B, ]3 @9 `+ n$ [! o, Z
{8 d9 z+ _: w. U
        int fd;
* t( z3 A( {1 m* r: x' a        int *mem = NULL;0 y- j8 ?" w  @$ X
) w3 l$ P8 s  o6 v8 p$ d. U; `1 ~1 v- m
        if((fd = open("/dev/mem", O_RDWR)) <0)
! G+ c5 v) r) v) i$ L9 k        {
: A  I% E' C1 n% j5 ?3 Z8 M                perror("open error");  X' u' Q3 d' Z
                return -1;5 r: n, }( \1 J1 N. K2 O6 H
        }0 ~1 o) u- b  N. I
        
) H/ V1 g5 m; L4 ?        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ?7 B$ f5 A1 Y7 K2 b9 [. F, |8 ^* w
        while(1)6 Z$ Z1 X$ X6 V" N8 M3 z  e; r
        {
' j) v; x! ], H: m8 Q# P                read_MSG_buffer(mem);4 N4 F5 Q# C2 u: Y1 t3 m- }
        }                ) j& Y- i+ K- n3 U* X4 ^' ~
}4 Y; m. Y$ f3 a0 c$ z4 E& N
  I; L+ G* v0 Q. {: F
void read_MSG_buffer(int *baseaddr)
8 a8 F0 \" y- p  H{, j* z1 f" ^3 ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;& L/ Z& }4 Z6 N" Z
+ O8 m* P4 r3 U" J$ \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( Y5 o- H! K9 v5 Q& E3 Z' T& j) @0 V
        if(pshreRAM->packet_cout != count_copy)7 }! k# v9 _" ?
        {
1 R2 u) A/ I  w8 d8 R2 b                printf("a is %d\n", pshreRAM->a);, M6 C5 R4 w" \6 h% _  H
                printf("b is %d\n", pshreRAM->b);# n/ E0 {1 I4 a! `! m8 N9 F$ \, w5 H
                printf("count is %d\n", pshreRAM->packet_cout);
6 y  o7 K$ A& T! G; Y2 |5 `                count_copy = pshreRAM->packet_cout;
% i' c+ ^) T( _. v% x4 n* B        }
- F& y+ J" d9 e# q% ~7 S        else
9 W- T( e- x) z( @, N1 Q0 ]        {. {# T* t' I; L; s* K+ h$ @
                printf("No effective message!\n");. |1 Z, W4 Q# o
        }
7 B: E8 j1 s+ r2 A}
$ w1 ]+ S; o) q  _' C" ^" t: ^5 K$ x. F# O& b( I0 W/ `' {! y9 o0 ]7 T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# _  m4 D  m9 N" @3 j
2 ~+ |$ h! f9 \* k- [/ j8 M
* f# U  A9 e! d: {/ ~  h) F9 ?, K. a- n9 a! B9 H3 B$ F7 |" J

! g9 j: g( d( ]. z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 05:08 , Processed in 0.041030 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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