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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" A. \7 I3 ?0 L5 j, H6 Z9 m8 _( A
9 f5 b: u9 M0 n' s6 IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  m/ R  u4 N/ i
#include <unistd.h>
1 w9 b5 x9 V9 t/ b+ n4 v#include <sys/mman.h>' y$ _9 ]! q9 |: a
#include <sys/types.h>' @1 @% O. B/ \" R" L, i' `
#include <fcntl.h>3 _; x* m9 x0 V1 B4 S" n4 R1 i+ O' t+ x

3 Y( _8 U+ i% C. X# \; w+ V. K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ Z0 a( K$ i7 T% i2 m
' ?* h8 o7 n2 W# xtypedef struct' a+ m8 f( c) x2 F, @
{5 y. g3 V0 l! {7 G# b
        unsigned int a;
; A' B7 e4 r- S* q        unsigned int b;
2 g1 v+ w% b% D! o+ |1 o: j        unsigned int packet_cout;" K0 d, ~, R! ?& |0 z# F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. D" N/ x' w! F* |$ D

! F1 r. L3 ^" V8 F# G+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 w4 e9 t/ ?- W/ q& Cunsigned int count_copy = 0;
5 `: B# q. o+ A, R+ Z% M+ W  ?2 L9 l8 G( E* |

6 Q  n; S  k5 R7 ]int main(), Y# @: f' Y2 X$ n
{
% O/ D! K* B: C* z' F: q        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 F2 s+ S6 J! Z5 B# d& o: Z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. D4 O' j9 \& h# k7 h4 T

# z- F0 Y7 S# E! ]- m- x+ K5 M2 L        while(1)
$ x. i! E: H; u& v' l/ |; G        {
. D, O/ ]/ k. n1 ?" {) k8 b                read_MSG_buffer(pshreRAM);
/ m3 y4 X9 e' |3 @        }               
& r- j6 h1 I, b  b& ]3 R2 k}2 _$ \7 L. d/ ]+ j6 P0 |

9 I/ o$ @' H! I, vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 l; j- \& U" c5 t% h1 U# h  f) J
{
7 R9 g% d1 y% B: f; N) A9 B' ~& `! U        RX_MSG_PROTOCOL buf;
9 |& E4 F% W6 y$ O8 j) E        
: d/ G8 t8 d; a0 {' X3 c; |        buf.a = pshreRAM->a;
: H1 h# Q9 S3 \% c6 x  R        buf.b = pshreRAM->b;
: A; T) n" A+ W5 B6 {) E- D7 f        buf.packet_cout = pshreRAM->packet_cout;
& R, W+ y) z2 C! Y- T        
6 K3 h5 \- h; M" i" K9 j& B( I        if(buf.packet_cout != count_copy)
6 \- [8 @9 c) r: x* E3 a: n        {( H! U' G5 c) X+ ]4 {* b
                printf("a is %d\n", buf.a);
. Y3 }0 y- a% @; ^: o                printf("b is %d\n", buf.b);
- f2 e) g: E( h+ f0 k! k) T                printf("count is %d\n", buf.packet_cout);1 [2 F7 J3 V0 u
                count_copy = buf.packet_cout;
( g# k1 O" M. L. {9 K6 X; k; d        }: J% Q7 i8 x. u
        else3 j. D' c( C" U3 H7 I9 f
        {8 ~& Y) F6 v# H8 Q2 t
                printf("No effective message!");
" e6 X' }. G: D: ]  v        }
6 }  ]7 ~. ?" c$ a1 e6 z}" E& Y* _- i* M2 n, X; ~
2 x7 E# Z& ~4 n" b+ S; [2 e

% l3 R$ z* q4 T0 u  J* }, _5 Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ o+ k: B/ `" d. G: E0 I& ?) U使用下面代码,对内存使用了mmap函数后:
- v, k4 B& W: t$ X" P2 z/ `#include <stdio.h>( Y3 _9 ]" G, Y0 L9 p8 E2 Y! C
#include <unistd.h>6 [; ]5 g2 e# P; l5 A3 V; @+ Y! t
#include <sys/mman.h>! {; ?8 [7 s* _
#include <sys/types.h>! B; `" v0 p2 a4 t7 y# A
#include <fcntl.h>4 q" Z# ~  }, @4 u# g1 x

3 H* A! ~; x) R5 X1 a% g7 G9 y6 u: ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
: y  b2 Y! D. T/ G#define SHAER_RAM_SIZE         (0x20000)   9 }4 B! p- @9 W# O& G+ C2 G0 J
3 m1 w, J) I, K
typedef struct" z5 W+ q: w+ f; i4 g8 r9 D
{# e4 D. m, H& y9 [
        unsigned int a;* _1 X( I: ^  J! k$ s$ [
        unsigned int b;
5 p( N4 A7 i* _+ B7 r        unsigned int packet_cout;4 @. N' w2 v' _& P- v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" E' [" V) h0 W8 ^, n

" j5 d9 {& {2 V# j1 ~& D' Y9 {void read_MSG_buffer(int *baseaddr);
# u# |6 p. x3 Y2 X. Kunsigned int count_copy = 0;
+ i% u. R" W! D5 T* R/ W: o# @+ j1 u. D* p( }' o
int main()  a4 c1 q( T' [/ p5 b4 ^' n
{
* ~7 T1 f5 k4 F  R" ~8 b2 r: f        int fd;8 b6 R& r& r+ V: {0 d
        int *mem = NULL;
( n* S* r4 b8 N4 r( W* _; A# V6 e6 L. T% O
        if((fd = open("/dev/mem", O_RDWR)) <0)
; y6 U/ v3 n6 x5 V& T( A$ ~        {
/ K) D% M$ T/ B; V                perror("open error");
- G) m$ F# |3 C7 C8 v& ^5 ?                return -1;
) t8 c7 ]  K2 C# \$ Y        }
3 T5 f) e2 V+ n+ U) S        
/ r1 b4 L4 X; v0 A4 L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 {0 X) h# Y, j- J$ F8 ^. F# y

# \# x- `% Q3 O$ O& N! P" y  M        while(1)
* ^4 x" c* F- J2 s        {4 t2 U) G( z/ A! |( @
                read_MSG_buffer(mem);7 o( z, F; y! ?8 N2 H: s9 {9 z+ G8 s) [
        }               
- w$ L5 I) Q$ F5 U) u}0 [6 l! p9 C6 Z8 ^; Q3 f7 e- s

0 W  M- o' I4 B& s7 yvoid read_MSG_buffer(int *baseaddr)
# d% I1 y+ t- e' Y3 r{( j6 O4 I% m: i5 N4 c3 t5 }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ f4 p3 m% A  d4 D! Q2 s. @% c3 U' k  D3 u  d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ M0 ~! T9 C! H5 s: ~2 z
) F! ^$ j/ Y7 O5 M6 C
        if(pshreRAM->packet_cout != count_copy)
, ?: z7 K+ D7 n2 s4 i        {
+ `8 \: C6 p; `7 n                printf("a is %d\n", pshreRAM->a);
$ N" }6 H/ u  s+ S0 S* {( ]                printf("b is %d\n", pshreRAM->b);3 f5 R1 e7 ]- n# H
                printf("count is %d\n", pshreRAM->packet_cout);8 L+ A% G5 X0 }7 n9 _
                count_copy = pshreRAM->packet_cout;
2 P* M- ~$ @# W- I, _/ s. p8 g        }
3 r, u# |$ I& K& l$ X+ `& j) _. e        else! H2 a0 a7 d* E& y
        {& L7 ]' j6 [. E% _) U+ W
                printf("No effective message!\n");
2 d2 [  ^: l* U. L; N        }( ~8 o/ X. R* b3 o
}1 _2 f' E- H! X0 O- m
" V/ O6 W9 ?& Y, w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, q" ?, u) z% z) \0 V& k
/ U! }6 B7 H# t1 i1 \; _- f, k( T
  h' z! h) Z! C, I) ^2 Q7 x- P1 t7 W" W' ]2 b* \

1 _" u1 R" A& d$ q3 X5 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 09:00 , Processed in 0.035155 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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