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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 {6 K1 ?2 n. y( {* c( i0 D8 s

: ~" F' i! C6 o; KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 Z9 l9 ?% ?( @#include <unistd.h>
! H0 ^+ E0 o' Z5 A4 Z! i0 ?#include <sys/mman.h>
; W" R) [% o* L# Q2 j, H#include <sys/types.h>! C9 P) `% U( `
#include <fcntl.h>
: F" S9 w# |; k8 o" O9 o; u! ]3 b' z' |8 I; ]& ^) ~) F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & n1 F8 t* t8 F; }# O
& O$ d2 }3 g7 d8 j* m, e5 u
typedef struct5 Q* y. T3 n2 @7 [6 ^! f
{+ U( d& b/ ]. H8 b1 f  o
        unsigned int a;
; R& q* z8 n' l) z( @, x2 H( L        unsigned int b;
5 v8 u/ _) T4 }+ L" c0 ]        unsigned int packet_cout;) A' ]0 ~7 ~2 A5 q! S# v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- h+ _) `( @1 C) d+ e4 I
' g6 G0 \7 ?0 V4 Q7 g1 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( u) |& T  q! `& q
unsigned int count_copy = 0;
6 H) T9 _* v. @8 x& p0 {' L& @# @* O; D/ l
+ ^# w$ ?, ?7 Y! v! w
int main()$ Q( {, ]: L3 Q6 g
{
; h8 L$ J" e$ `& Y        pRX_MSG_PROTOCOL pshreRAM = NULL;; x0 [. u8 e2 V" w* t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  k" ~; z( h) K4 ~3 A
6 K7 P5 ?+ ]9 L" C7 j) W
        while(1)5 X6 X7 i. f! I7 |: N' }" A
        {
2 Y' B4 S7 w& C* F7 R' t( _                read_MSG_buffer(pshreRAM);, I- ]: H6 s% ~+ n
        }               
6 B  f1 T+ v( @5 z}. _/ N0 o: z' G: T* [  r1 M

1 f9 `; ]: @! H" tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 R( C! F+ q. |, ^% Y: f
{, G! L) {- ~1 a& B
        RX_MSG_PROTOCOL buf;) y# m- S/ L0 J3 ?) e
        
/ j; \. O* K1 z2 j        buf.a = pshreRAM->a;
8 i* {8 O, |7 D- x7 p! s        buf.b = pshreRAM->b;
4 l1 ]3 ]2 p6 t" X/ w2 G" W        buf.packet_cout = pshreRAM->packet_cout;
4 E) C+ J' @, J        8 p6 K5 ^6 m2 w* y3 ?) k. O
        if(buf.packet_cout != count_copy)
7 g9 v4 |8 F7 E2 W; O        {. l* @: u6 x) _  A& N
                printf("a is %d\n", buf.a);0 {  h; T: j. ^% k9 z8 ~
                printf("b is %d\n", buf.b);
# ^, |- z4 o9 h4 I) s' Q                printf("count is %d\n", buf.packet_cout);
  k8 p, U  q1 M  K- {( I' q                count_copy = buf.packet_cout;; p  C- P  T$ [# v6 ]; ~
        }
( U0 w( b7 F: x& n        else+ f  d/ Z4 D, |4 s6 _
        {% }! c( ^% o% ^* t2 o
                printf("No effective message!");+ t: h8 |9 e  h# N8 b, N% D" l  L  E
        }; i: s1 W3 C: x7 K0 c
}
5 Y! x4 o$ n! O# Q/ C4 G$ f% ^
. J7 n; y# ~5 r( h  {. Z- `  T2 S; c5 q* I0 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& @# {  i5 g$ H5 |# g. @* U
使用下面代码,对内存使用了mmap函数后:# n+ ]9 }+ I0 B' E' a' V& p; K
#include <stdio.h>
  o' d, U* N5 {6 u#include <unistd.h>
0 {2 t5 q% Q$ d#include <sys/mman.h>' f& g3 L) M+ S9 G8 R2 t+ s
#include <sys/types.h>  f% I# W# T( l) t* j' p
#include <fcntl.h>: ]9 R4 A5 [1 ~: V, ~8 ?
! |- ?* C- Z8 k; s( V, u
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ W: ~* M4 G) j7 k$ v7 m#define SHAER_RAM_SIZE         (0x20000)   
% o7 @( Z' s6 c/ {& v0 h1 G. c
" l& U: T0 F  G: atypedef struct2 B5 R# K; u3 o
{
2 T9 r( c4 u8 v+ s        unsigned int a;
# L, i7 U9 ~. U) v        unsigned int b;
' w+ ~' E# d8 P0 n" f) I# w" Y. \9 j        unsigned int packet_cout;: Z6 A' f1 A0 `; G4 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 R' b8 ]) S! }$ O9 y: j/ b' E

! R# Z  {4 J, A4 B! X" ivoid read_MSG_buffer(int *baseaddr);
, @8 X( r7 [9 K6 }9 \/ V, Lunsigned int count_copy = 0;
% s7 L) k$ {8 n. S; \8 ^* S" G8 }% N1 p
int main()
8 C* F4 q8 t" w; n# n& ?# c4 l# z/ n{
' W9 Z* p) m: ^+ D/ M        int fd;' O4 T( a: f0 q4 K/ J2 c7 ^
        int *mem = NULL;( K. p& Y! L( ?+ o; p4 E4 L2 i
5 q6 s* q% @* T/ K
        if((fd = open("/dev/mem", O_RDWR)) <0)
; L8 L: f9 z  y2 g. g/ c* O4 i        {
& B/ e1 k4 p4 c* f4 w                perror("open error");
) q; Z! @) P$ b$ e/ l: `, R                return -1;. S" U; i7 `6 D7 }0 f6 C
        }
0 `  _) r: @. j/ P! x* N        % L% o3 u. Z+ p. Q! l4 u0 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! J" |* N, N+ ?3 R+ T

+ l! Q/ o9 o4 U& K( ]6 @1 [$ Z        while(1)
' `/ p" V$ m5 [8 T8 s6 e" p. x        {
  J8 P$ {$ n7 r                read_MSG_buffer(mem);
$ ~7 ?* q3 _3 p0 j/ [) `+ _. \' u        }                # s5 \2 c% ]' a1 J9 w/ c! `7 C( j
}2 }/ d; B/ v* |, T) C8 X

( ~- Y4 z0 H9 B( s4 R: svoid read_MSG_buffer(int *baseaddr)
0 }- m: x4 {, h$ D' j{
9 k) u% b1 v$ k: G        pRX_MSG_PROTOCOL pshreRAM = NULL;
- {  Z' i/ J- v4 f" {5 f' D' H0 I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 x1 N$ C0 I6 U) h( v( m% h

. h, ?. Y9 w1 A+ r. ~  g( @  _        if(pshreRAM->packet_cout != count_copy)3 r4 V) e. p6 X
        {
7 ]9 I  L$ w1 ?, v! N                printf("a is %d\n", pshreRAM->a);2 G( s) S7 ], o% f# e/ F, a1 F
                printf("b is %d\n", pshreRAM->b);
) t2 m! G! H( i9 M                printf("count is %d\n", pshreRAM->packet_cout);
" s: k1 M. |( N7 [& s                count_copy = pshreRAM->packet_cout;
7 {. I/ A4 ^7 K3 @5 f3 e        }
0 I! A: L, p* B0 Y* h5 F+ R        else
* U( Z( c) |2 h, X8 Y        {
. `3 f/ a# p( \7 T5 w9 W                printf("No effective message!\n");
2 N# B: B9 c8 X, t6 R' \        }+ M6 q5 c# a' `+ Q8 O
}
0 j+ ]  ~2 F. U  T$ \7 i3 K9 q) z- ?% A& K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" U; X& O$ Z1 Z- Z7 ~2 k& K5 l

' Q" T" X8 [. N) n4 U3 }
  f1 x& |. s% Z/ ^* T6 e" u6 n* M" y
" x8 w: w3 K' K2 n- Q( U6 x
5 J: j/ b" y( q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 14:15 , Processed in 0.040897 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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