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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 W" W5 F( W; \( T0 M
; I# c, K$ a) G$ b0 Q2 N( f* N& POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 a6 e$ g  C+ J! i, J4 ^
#include <unistd.h>
4 v; R4 Q$ d8 M2 V# K#include <sys/mman.h>
1 k; F) d5 Q. G5 m  _9 n1 @0 `" P#include <sys/types.h>
  F2 ^( ~6 s. R# y3 s9 j#include <fcntl.h>
' L  a, [9 P7 F5 M4 x& _
5 q8 L' r5 x4 w$ c7 v$ `! N+ k#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- |- b2 u1 i* s4 ?/ V7 A; T$ I! c4 [$ i& b9 C
typedef struct
; f3 u* l- A3 |{
# Z0 C; s# y2 ^+ R* k  i+ x        unsigned int a;
. D7 B" b+ ]! E: ^4 e        unsigned int b;
( r9 L! |% T% T4 _        unsigned int packet_cout;
! z# t1 h; l' a" ~4 ?2 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 F) h4 J, [% F9 L
8 \5 R9 I8 ~; x9 D! v& L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: ?5 s. z8 \3 W$ O5 h+ N; ?/ v
unsigned int count_copy = 0;( L+ e, T! i& r
3 B. O( C7 R1 y
9 p% B, t4 B7 ~
int main()
( c  x" ]( A2 W: b{1 n) V% j& u- X* F, A; r+ `1 n
        pRX_MSG_PROTOCOL pshreRAM = NULL;- M; T; a) ~" Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% h" F+ t" e4 i* e2 t
* K; v1 H! ]& k! t3 Q+ R4 U# v        while(1)0 A+ i" V1 D, X
        {+ V' [6 r3 v# S, I  m
                read_MSG_buffer(pshreRAM);
, J& k1 F0 Z# \        }                # ?& d$ ?# S+ E+ e* ?; c
}3 r* s# |: L" ~! N# s& f# ?$ ^$ g4 O- ~
" u7 b3 N8 `* y, x/ t% X- e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 S5 Y- W# v! p9 n2 P7 w/ I
{0 I, z) J. r! D$ w( m; m
        RX_MSG_PROTOCOL buf;
* `. q" X( A( d/ K        - s# n# F% A9 Y0 w
        buf.a = pshreRAM->a;
/ c( B! v  s4 u# `% L: b2 d: t        buf.b = pshreRAM->b;
1 h. U0 e  W* r8 R% l" i7 s) _2 G4 B        buf.packet_cout = pshreRAM->packet_cout;2 W7 S: g  |3 J6 }
        6 G8 i- Q. h3 M! Q  i9 Q0 x
        if(buf.packet_cout != count_copy)
& f3 v! m4 u2 E4 M  \        {
  n: i9 y( m5 Y; z4 }( P7 ~                printf("a is %d\n", buf.a);4 l) a/ a9 _9 X2 M1 F& l- |
                printf("b is %d\n", buf.b);
1 d& o; u8 ?; A8 i+ j; o8 F                printf("count is %d\n", buf.packet_cout);. Q8 W$ A& W2 D2 M
                count_copy = buf.packet_cout;4 N& M1 u% a4 o+ d( r
        }
5 t+ H( A: p, i1 o7 a        else- e2 [: _" K) ?8 a+ Z4 s1 t2 Z
        {
( s, X% i% u7 Q. K6 p                printf("No effective message!");
+ z! x! T% L6 s! [        }* z& r5 e9 C- [
}; P! }& X( ]" i& Y" D

( c; {/ K2 ?# l% ^! w5 j) |; z: f0 x% q. X  s0 T$ J8 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# f! d9 U( k7 X( ~  o
使用下面代码,对内存使用了mmap函数后:
/ ~/ F2 d# i) y+ t#include <stdio.h>' B+ w* u5 z3 `2 i% I
#include <unistd.h>
* ]! l! o3 p. P" R0 E! A#include <sys/mman.h>
8 w7 {6 u$ d) T) G) p#include <sys/types.h>
' `/ _2 D0 t# E" Q. X#include <fcntl.h>1 Q3 p  {. ?6 h# G" C9 A
/ P5 T+ i1 c6 r7 _- g7 f0 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ D! K0 L  H9 K( G0 {#define SHAER_RAM_SIZE         (0x20000)   , Q1 y" {6 I( I9 M& x
* b7 u( e9 Z3 L' f8 d# p
typedef struct* ]# h' X% o! ?8 B: T
{
. I2 [  x1 @* K/ D+ y9 U. E        unsigned int a;
- T8 E6 M* ~% y2 a: C6 d5 X2 }7 f        unsigned int b;
' q3 u1 }; p$ u$ i+ @7 O$ q+ N        unsigned int packet_cout;8 K8 S* u- I3 }0 L  Y6 j  R5 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" y) j' w- s" p. ^0 p
1 t/ a& [" j9 \2 P* y' |) L& mvoid read_MSG_buffer(int *baseaddr);8 b( l% k8 O( _! u- m9 Y, C$ f
unsigned int count_copy = 0;
/ \" w* ^0 o' R4 i" `' \# S2 q8 J5 m7 z! Q% ]/ N
int main()+ Q" o% q8 X7 ^! X
{
/ J9 @% u8 r. c" F8 w        int fd;
$ F. J3 S  z" O        int *mem = NULL;7 n  i7 C# F7 q* G, [# M
# c9 R- E0 J4 W" G+ [2 \0 G: B
        if((fd = open("/dev/mem", O_RDWR)) <0)5 n+ o% [! h4 w3 @! S2 n: z
        {
$ U- q8 N( c5 {, M                perror("open error");
, b4 U# P8 E3 G$ V4 K9 H, m4 y5 B$ c  h                return -1;
9 P( x7 l* z' L& j9 U  L  `        }
( Y$ T3 W& C1 b; G        
9 a2 Q) X1 }  a/ l: _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 M4 ]3 i6 C" g

( D+ j4 A; }/ B        while(1)3 s2 y# ~  a* L+ ~
        {: y  x- _% ^, i! n$ B
                read_MSG_buffer(mem);
( C+ K4 N% N& K9 y! a  m        }                1 r' n' `" @/ ]. y; Y9 R8 D4 B
}
. J: t( y2 O7 m) k; x& n9 k6 ~0 C: t4 Y& f" T
void read_MSG_buffer(int *baseaddr)
+ e5 X6 O; F( Q" p" Q* ^{
* h* l! q$ r& D# C5 |2 b9 W        pRX_MSG_PROTOCOL pshreRAM = NULL;. A, n  r/ x/ {! j$ x* G- B& m

# L" S/ Z; q! c6 D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; c$ d4 K7 ^" d( ?- R3 Z' _
! a5 v1 {  @* A: c- i        if(pshreRAM->packet_cout != count_copy)4 F/ E" M! l* ~. i. Q# `
        {
9 w2 X3 C, m0 ~4 Y                printf("a is %d\n", pshreRAM->a);
6 H$ Y& i6 i6 V+ K5 I                printf("b is %d\n", pshreRAM->b);- d( r" C7 h7 {8 h* v
                printf("count is %d\n", pshreRAM->packet_cout);
( O. O8 z4 A! O% _  r6 P* g0 K0 G                count_copy = pshreRAM->packet_cout;8 P" U6 ^$ T: t) y! j8 b
        }
' b- z) E4 m# L5 `; Y        else8 A5 O9 l$ M$ T# m+ V+ S
        {8 x# r2 D/ }7 y7 l/ Y
                printf("No effective message!\n");4 \4 P7 q" U% Q& y, ~
        }+ r& t( i' W! y8 L% c4 h& [; ^
}- t: o7 z; W! |7 ^

9 u. M4 ?9 p* s# {' U: L7 p9 T  A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% E. S8 i5 n# \8 p; y+ {; U2 I# s  m% b/ u5 A* f) ?3 n2 J

+ Q3 Z6 @3 n4 z
6 p: D8 D! g4 N' G9 f2 l% @2 q6 W* Y' G! y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 20:47 , Processed in 0.045199 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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