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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& }( N7 y% `/ n! ^& t9 I8 Z* o4 c# I- l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 u! |9 p# a) J8 t# p* K#include <unistd.h>, S5 a8 ~; H  _* C- j
#include <sys/mman.h>
: J1 Y, n# k* x#include <sys/types.h>
/ X6 v' ^/ ^7 V- W4 J0 F( W#include <fcntl.h>( X9 x1 h) I8 X/ ^& @( S! k
; I" Y& g. S3 U+ O0 I7 h8 e: H( [
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ s; F8 e) L$ U" ]/ Q
, A. c% ?" z; h- ]
typedef struct
* i7 t& t5 j' z$ i- l5 V/ k8 ]{
& C4 p4 I7 [& _  j( V        unsigned int a;
4 p3 H. C6 B1 i  x, w# V        unsigned int b;8 h* a; w+ f6 Y  K4 F5 B
        unsigned int packet_cout;  m/ m, s) H4 ]/ I/ z  f" x9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ K& b- F$ J9 V, `1 Z! A. E+ w6 |" w1 R5 x2 T& N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ P+ K/ l& a6 x  R, A; [1 @% aunsigned int count_copy = 0;3 Z0 x% U. h+ n# I2 x# |4 H

" Y9 W& N9 i. h
) F8 c7 c" m$ a- H) d! }3 D% g3 C! yint main()1 a, c5 u( r* W" u0 p; Q
{
/ t9 K& h/ ]1 f        pRX_MSG_PROTOCOL pshreRAM = NULL;
# _; |# g2 u/ t+ U: i9 K; t) \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  x, ?+ i6 q# d" {. N, ^$ `

, f+ s8 U( Q- x" q        while(1)7 h! Z1 M; y3 \, v, x+ o3 W& M9 y, x
        {  r% [9 M" B6 `1 o: c/ i1 w0 p
                read_MSG_buffer(pshreRAM);
( h( m3 g3 u- v' l5 r6 Q( ]" Q8 ]        }                ' D. B; d3 Z- |6 l# E  x+ S4 I3 M
}( a, r, j$ z8 ^  ?$ m! ]! x% \
% k# e, S% M/ r, r4 _3 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 c- G* H6 X4 i9 W' Y{( g6 r) Y& s+ l, s. c0 d2 e9 [
        RX_MSG_PROTOCOL buf;( u4 A2 w! t, X- Z: k3 ^& ]  D
        8 F# v2 z# G! w( {; r+ J0 p) l
        buf.a = pshreRAM->a;
7 O* R5 {+ T9 E4 x3 m        buf.b = pshreRAM->b;
3 I8 m7 v( ?/ `" ]        buf.packet_cout = pshreRAM->packet_cout;
; |2 U6 a9 b7 Y; J        
5 p6 Q6 H( r" ^9 S# a6 @        if(buf.packet_cout != count_copy)7 b; s! y7 f2 _
        {6 d- m/ G5 L; `0 ?. _
                printf("a is %d\n", buf.a);- R$ K. P$ t* ~& X; Z* I% p
                printf("b is %d\n", buf.b);! C% y  G2 w0 d$ `4 O: u
                printf("count is %d\n", buf.packet_cout);
4 _( {8 I: F- O1 U                count_copy = buf.packet_cout;
! ?# I& c1 A! ]4 F        }, k1 Q, f3 P( p: k
        else  w" C8 E2 V! D5 x0 o. o2 V" }/ U
        {% |/ V; w, E+ [2 S5 s5 j. N, p
                printf("No effective message!");, W& E7 b; @8 S: ?5 z# N
        }1 q% Q( P- b& B
}
/ ]0 B0 u7 s. N/ C" P
3 W9 L5 ~& s  s5 x; c" `7 i
0 o3 T4 w: W' G: l% V; F0 f2 g2 k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& L& \: N6 ^1 v% w使用下面代码,对内存使用了mmap函数后:1 q, Q8 N: ^( L% h1 R1 |( Y# U
#include <stdio.h>
; J+ o' w/ u- {! x#include <unistd.h>0 M5 ~% X; c' s& v
#include <sys/mman.h>% X' L1 i6 ~% i# L
#include <sys/types.h>
# P9 D1 [& r9 f* Y  X" l#include <fcntl.h>
+ P  V2 a4 B/ Y) w% |' E- f0 k, B0 i
0 P. j7 e; d# R: [#define SHAER_RAM_BASE_ADDR    (0x80000000)9 D4 h  |* h8 n) l
#define SHAER_RAM_SIZE         (0x20000)   
/ x) C# O; s! |9 l+ m: c" ^: M- v8 ^- W2 x0 R
typedef struct) Q4 V7 c' |; K- m1 ?$ I
{
+ [5 V3 Q  d, [& V' r6 Q        unsigned int a;
) j6 t) }) K4 n) a, W5 w* n        unsigned int b;9 w! ~/ o. H/ R% y
        unsigned int packet_cout;" n/ V, _$ P0 Z% F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 L$ ~4 i; W! d1 h

8 [, @6 ^/ G0 r0 z9 bvoid read_MSG_buffer(int *baseaddr);$ ~2 f! M- w* H! s# t
unsigned int count_copy = 0;
* Z& H! r  C; `- P
+ h( W( y( f, Q) c" ~9 h8 b, U/ oint main()
8 B* A, t! O( E# ?+ s0 H+ E. P  \{3 N# t3 d6 _7 R# T; |" x% E  _
        int fd;2 e6 n$ S0 H+ T# I2 ?; M
        int *mem = NULL;
: d; ]' l7 H- |( Z
+ M! x7 X2 L2 m4 E2 z- }4 J1 n        if((fd = open("/dev/mem", O_RDWR)) <0)
9 R: g( {4 G8 a) e; x6 o        {
" E) C+ D7 ]6 I5 U                perror("open error");% Z* t/ L' h" t/ N" I
                return -1;3 ~4 |( L2 B" M+ X
        }
% r" V: T+ M" R+ q1 K, E        $ [: n' }8 P  Q+ ~5 J. {; S! i# ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% {2 h5 r) I" q% Q# \; U% `$ s* g* y) m
        while(1)
1 ]  s- ], C3 h5 G- B        {8 l+ m6 J% {" `: W* G5 Z, d9 }
                read_MSG_buffer(mem);
, z  Z/ {( L  L- I/ B# @/ r        }               
: o. e+ T7 r/ ]* e% y! N8 q, X4 ?}
& G/ j: M! W; M1 [2 ?4 c5 s" H/ `  n
/ L+ C0 a! N& H, X- z0 Xvoid read_MSG_buffer(int *baseaddr)$ _2 F$ y' ~- x6 M' f8 p
{
( z' `$ @. C. H; r5 s! ]        pRX_MSG_PROTOCOL pshreRAM = NULL;8 V( Y0 U) ]+ m) w, G5 n+ E

$ t1 R& S' L2 x& f" M$ u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, Y6 k% c* n/ e6 {. C# t
3 j7 `4 R+ _# k: x) `; l/ X        if(pshreRAM->packet_cout != count_copy)
0 f/ ~; I' c/ G1 ^        {
: ~/ K2 ^3 l" a/ @& O. [# |+ U& M. O                printf("a is %d\n", pshreRAM->a);
$ ^9 p6 F7 `/ {$ ~2 [5 c                printf("b is %d\n", pshreRAM->b);+ Y7 W+ l6 ^: \( J& ]2 I4 O
                printf("count is %d\n", pshreRAM->packet_cout);
& h& W. }/ ^& g  T% L( V% P                count_copy = pshreRAM->packet_cout;8 U3 n1 a, M+ W
        }
  L; w( c& y, S+ X/ |+ R        else
! z: `; Y, @- p( W) ?& O        {
' }- r/ l: [) t$ t- y) ^8 E5 F# ^                printf("No effective message!\n");* r4 O4 ?! Q; y- `0 g9 g* s  P
        }$ j4 g' I" q+ Q" I  B
}& O2 k% V" f. t0 u4 w

5 p1 A3 n" X; A$ K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  H9 F0 W( q* Z9 Z- V# y% \: B$ `& p, f
1 S! Q1 W6 L/ L* i6 r8 [1 e
# T2 N7 a+ t) w. s

) h' }! p$ B& H8 G' V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 03:38 , Processed in 0.057169 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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