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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : A' ^1 |: V! i- v, \, F
* d  Q7 I/ w: p( @' n7 k( K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ Q! |- h3 m# q7 k
#include <unistd.h>, y1 @. |: L! p8 ^2 m# K3 t0 Z
#include <sys/mman.h>
9 y  m# ]) x: C3 Y/ Y6 `& r" u7 n#include <sys/types.h>! [. c8 n$ e2 x. H% |; k* x
#include <fcntl.h>& w. F5 E0 q" g1 R7 f
( |' O  I4 L# S3 j8 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, q4 K. O- o: I5 u
2 M1 v" G! n3 C4 ~  K( Otypedef struct# f$ d# U+ j( F
{
! X# ?: x: l$ L9 y! E% p+ `) s% {        unsigned int a;
( Z% a2 `* W) `- i: |0 J, I        unsigned int b;0 A# m3 }- ?( W( h) p8 E( u
        unsigned int packet_cout;+ H8 Z3 R0 ^: A( Y0 ^4 h) D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 |* l$ v. Y; s. [- U5 [  ^. `2 H7 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 k3 z& g4 M  Vunsigned int count_copy = 0;
+ V$ Q3 g+ S$ X" Y4 V+ j+ [3 \/ n7 s
  I" _% U7 E0 j1 D9 V$ W8 N- ?6 w
! J# f4 \. I, {, U" Sint main()
2 p3 s3 \6 }0 u1 s{
- ~$ i! g6 }( O+ A1 u3 S, g        pRX_MSG_PROTOCOL pshreRAM = NULL;& y/ P  E, G# p. W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 T* B, r3 Y+ \; q- m

" g8 Z( c$ T3 B4 T1 o% P( L        while(1)2 K; U1 m1 u; R
        {
/ H& ?3 r8 v" E7 f0 H                read_MSG_buffer(pshreRAM);' q6 D3 c  Q+ o3 A" F+ `# h
        }               
8 [- d+ F( f4 Z5 Z1 z}
9 o; o8 [9 o! P0 y  j7 U/ l6 p$ O# U7 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) S( X& B9 _" m& f. T
{
3 R0 Q9 n5 J- ~( t2 `( b& N) e+ E2 p        RX_MSG_PROTOCOL buf;
) A( W5 j& m" d: Y9 |        8 o. S3 C, g1 q" u) O7 x6 Y7 M
        buf.a = pshreRAM->a;
4 u: g2 t& \0 [* G) r" {8 Z        buf.b = pshreRAM->b;
" @2 H. Y. U4 L8 o        buf.packet_cout = pshreRAM->packet_cout;. M! q' G  d( Q/ t
        % H$ K0 j6 }- P, r+ }6 [1 W
        if(buf.packet_cout != count_copy)
# |( p$ G! Z$ c5 d        {
8 o" t0 |$ |0 h/ ~( n) b* E                printf("a is %d\n", buf.a);5 k3 R/ `: l; B0 ~4 F# r8 H
                printf("b is %d\n", buf.b);
2 v6 q0 q, B! C( `+ p  ]                printf("count is %d\n", buf.packet_cout);) |% j8 v9 A. [/ C- q  D2 F) D+ g
                count_copy = buf.packet_cout;
; t+ f6 g' Z2 r) y( v- `        }
2 M& P8 l7 y+ U4 a' |        else
% Y* q7 b0 X; W9 O2 f1 j        {
; O6 R" r1 L4 g                printf("No effective message!");& s8 d: R! B: a7 R( ^& o
        }
- X& ~5 H4 E9 L6 j: k}/ U8 @8 n1 W* O6 J5 ~( f# ]1 z

5 r/ y4 C( |  o7 p0 }' P$ u7 e. Q( i& y% n( c2 M, ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 w8 t, c- T" X- w2 b
使用下面代码,对内存使用了mmap函数后:5 m6 W" ~( x: ^9 j$ h1 U4 Y; ~
#include <stdio.h>2 J& S7 l* r. X' p4 U/ s$ e. H
#include <unistd.h>1 o  [' {! q8 b. ~% {7 I2 r
#include <sys/mman.h>2 H* C! W( r8 a2 W& ~
#include <sys/types.h># j( _0 }: {% d( B
#include <fcntl.h>& Y7 I+ ]& @6 G. U$ d! }
( h1 A% _2 s1 Z* w, X, s! v/ E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- l0 R" K6 X4 U: Z: K#define SHAER_RAM_SIZE         (0x20000)   
% V0 I) [2 G& P& V2 a
% _/ M8 i9 t" g1 T' Otypedef struct
! o2 t7 F" a$ Z{
% Y. h- ^; T  R, N, e; F4 T0 Z        unsigned int a;, z, \  c2 d7 E: b! _
        unsigned int b;
( J; k0 L- f3 @' n! i. c- f        unsigned int packet_cout;% T) V' K$ N& g' J' p! s" C. W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& p( Q) o3 o: m% l
/ T$ R% s8 q, }3 S1 X/ e7 x! T
void read_MSG_buffer(int *baseaddr);, M3 A  {: j" S5 g$ y3 [
unsigned int count_copy = 0;8 C+ d( M/ i+ {3 j
3 l" |; @% r% ]; C: C: \1 z' Y( P
int main()* L5 f8 K" {) s6 K3 z
{  [0 i- L& a% W" N# u9 @, h
        int fd;
; p5 I) x; [- U4 P8 f0 D        int *mem = NULL;1 J( c- S5 u5 U1 {+ Y' [7 C
0 \) U. l/ j/ l- P+ o1 b; H
        if((fd = open("/dev/mem", O_RDWR)) <0)4 j8 Y+ M2 \$ V% P$ D
        {
& I: W' t# p% _! @+ D( J                perror("open error");
8 c$ J* d' w: Y# S. A                return -1;7 ]( f" }8 L! E2 Y
        }
7 r. O" ?! o8 j$ W: |5 ~        # D4 u' G5 ^# `. D0 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* z/ r0 E; L8 w" J% I( @0 W6 R$ l6 m! v, k& G) _4 g2 Y
        while(1)6 I+ a( G. v% F  Z" D* E# k% ^( `$ c
        {
. X8 v" b: f5 f% ]9 S                read_MSG_buffer(mem);
9 F) ~5 ~# Q3 Y        }                " b6 z7 ]: j4 t! m7 L1 p! g$ O
}8 L) E/ K# [, ]8 b

6 Y( u# y" p& ^; E- c" ?  u; Q3 Qvoid read_MSG_buffer(int *baseaddr)
2 f) q) ^) Z2 j4 H# y) g+ U{
% ~5 J/ x3 J& B. n1 M% G: Z        pRX_MSG_PROTOCOL pshreRAM = NULL;# S, b" J- E( p7 Z

" U# p, _6 t& R* |        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ y; a0 w; H) j. g3 p
- F5 N1 R2 e1 p5 u' j
        if(pshreRAM->packet_cout != count_copy)6 U+ ]4 @$ T$ B$ V8 `% u* c
        {: b- G: ~  {7 K4 v/ [9 \
                printf("a is %d\n", pshreRAM->a);
5 \) D6 i& K+ W                printf("b is %d\n", pshreRAM->b);
5 f0 v, @9 T/ j; K6 t8 {                printf("count is %d\n", pshreRAM->packet_cout);
) Q3 J! j3 q' ]+ s0 J. Q! A                count_copy = pshreRAM->packet_cout;$ o( D: z, l" s6 ?; j& }2 d& [. q( b
        }
4 E& H7 y: `  a/ s3 o  ^        else
# Z( ~& S! s. W- u7 F4 X" s        {
  B0 z& y5 x, ~$ E/ F                printf("No effective message!\n");
6 `5 n2 w. S) f        }
9 D# ]' [1 P# c9 q3 N9 T}6 p2 t! i5 V3 z

) _, T0 K! W! {' I: R% V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. o" z/ |3 e# ?6 `" q/ G* r2 o
( r" O, h0 s, h6 _
: R0 {: q$ f% j) C# f" n

( i  D0 d+ w' P
' w- ~5 t4 Z% e/ W2 ~4 b% i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 03:37 , Processed in 0.043698 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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