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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 T) c$ |0 h, |+ Y5 G/ @" S5 j$ M  [  y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* x) |- w; [2 Y4 s# N$ K3 y#include <unistd.h>! v/ C, r* S! S+ J2 d
#include <sys/mman.h>
: T* {- b9 e+ e& d#include <sys/types.h>8 [5 X# O8 X* @  c/ A% k
#include <fcntl.h>
6 p+ q- w8 u4 z5 s/ s; i. I8 z; F+ D, p' t( D4 t0 E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " Y2 I5 ?% a' d9 ^
1 P' A' |) d; w* O/ E4 g
typedef struct
) v% Y* k* ~6 g7 Q{6 ~0 A" K& `" x3 E
        unsigned int a;7 T4 c4 k) V9 @, a
        unsigned int b;. k" [# j1 V* @1 \3 _% G
        unsigned int packet_cout;
( Y; q) m# V: U6 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: Y6 O, a7 ?& M' m: G" G  B+ T6 F; Z/ Q. N; F7 E5 U: N$ q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 E  W* b" H* u  g2 ?( U- Hunsigned int count_copy = 0;
/ t- }* T/ E) V; h( e% j; V( p; p! ]) [8 l! m  W9 s1 ~  j* f
; Z: i4 p* b9 d8 t2 c9 k8 K
int main()
2 V% N: P) B" q5 F+ A, b{9 D9 z  w( }) L& Z5 k" r2 M1 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  @/ O# g% v$ |! ^4 j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 B0 Y8 C6 h9 l7 _" D; p

+ c8 ?( K0 P/ d        while(1)
4 ^  H/ }: c5 Y% A5 \$ Y        {
( Q0 k" ]  w8 e1 J8 }8 r                read_MSG_buffer(pshreRAM);
# ?. u/ A( t4 o9 p: s        }                2 j5 P9 w! X# j
}% T, \7 Y- R5 W9 t& z) a$ M( S
% I7 l" c3 V) C1 i$ T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ \# F2 t/ ~. L6 c{. m3 F5 |# D0 n! e9 a! s4 Z& r
        RX_MSG_PROTOCOL buf;
9 ?+ M; n0 K9 T: m* A, y' G5 o; B% _        
; ^) Y0 f# Y( Q# g$ f# I        buf.a = pshreRAM->a;& l, R. D! v7 L
        buf.b = pshreRAM->b;% ?) \9 n1 w- f" v
        buf.packet_cout = pshreRAM->packet_cout;
6 _% I& W/ Z6 _6 p        3 h6 l  K4 x+ S: z# ?' e
        if(buf.packet_cout != count_copy)  R0 w4 m/ R8 k& d
        {. N2 V" o8 A6 e2 V  e
                printf("a is %d\n", buf.a);
- [. h/ H. g: b: Q7 d                printf("b is %d\n", buf.b);% @1 e$ p. D* |. k4 V
                printf("count is %d\n", buf.packet_cout);
8 r9 \+ c7 a1 ^6 ^5 ]/ D! }: z. L) |                count_copy = buf.packet_cout;
1 D6 r' E3 x$ A. b" u% u/ Z        }& j! |0 q, s2 \" m; b8 c1 h
        else
8 s" H% Q: a, l# j. i0 p        {
2 I7 G) p0 N4 K' ]) `  |                printf("No effective message!");
, h3 P1 Y" o2 U6 B7 V        }3 _) y* C2 R5 {* _
}2 T# c- W- j% c3 a

5 \& Y: [) _' J" x4 k3 }$ a
8 X" T; p$ i7 }2 E- `3 Z% D' Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ |: R# N  Z5 k* ~5 E
使用下面代码,对内存使用了mmap函数后:
6 F  D7 }, {( F#include <stdio.h>
- t! t0 b5 E) J9 U: e) I9 [2 Z6 w  s#include <unistd.h>! k% |. P) P; ]0 k% t% @
#include <sys/mman.h>9 |8 H9 h2 J' m8 _# B- k; X
#include <sys/types.h>* p: O5 L+ b* b6 _: C8 f
#include <fcntl.h>
0 @! C; A$ [2 @. v3 w6 |8 u4 s+ \* V; G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 S! c# P4 V) H3 \#define SHAER_RAM_SIZE         (0x20000)   2 P+ _1 {0 G- m7 G9 a5 x( C

" G$ [, q; D- ~  ntypedef struct" K; ]: e1 R: ^% g7 }
{) F: U0 d$ y/ B3 j% W
        unsigned int a;2 p4 l; Q+ }+ n( c; [
        unsigned int b;
) l0 ^- I$ x5 W: h! U9 U" N        unsigned int packet_cout;
" p4 x& @6 k& y/ S$ ]% C! X" e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Z+ y( m* K) z! j4 T. W' h

" G) m- @1 C# A4 {void read_MSG_buffer(int *baseaddr);
8 \! Q% ]1 G7 K0 I/ g, N# C9 runsigned int count_copy = 0;
- O0 t+ b1 h$ T2 ~/ j1 @8 u
4 `! D# t3 K4 i) D! `! Nint main()
/ ]- ^2 {, l& v" `{
* d5 O9 O5 o! B  V        int fd;
# F7 V' K% x  f6 D+ E2 W( `0 _        int *mem = NULL;
( ~: g* e1 o+ ?% K# U
# t* x$ M0 j% v" S2 H4 ~1 E5 k4 O" {: o        if((fd = open("/dev/mem", O_RDWR)) <0)3 q6 i5 _/ k1 \$ v% i' e9 P; B
        {* s" o9 S* C) j) ^7 q
                perror("open error");
! i/ H! |5 z4 F& `; R/ J  N3 I3 \                return -1;
0 f3 \( ^% c3 m$ K! V2 k9 \2 g        }
9 b. y* o- I6 ?2 J        
( v& G, T6 M. \) P, Y9 h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: y8 i  V. V2 e$ U# Q3 N9 y6 }" }4 x8 M
) E. F# t7 m' ~2 `        while(1)" n; f5 G5 l) G
        {
' c; q& d  v7 ~/ w8 X) s  w                read_MSG_buffer(mem);
# w0 b1 C8 }# M- M/ k        }                  h) s: ]) I: m& }
}$ N1 c5 T$ D, }5 ~2 s9 t0 s

+ n; A. _7 N) C! [5 Xvoid read_MSG_buffer(int *baseaddr)
8 M! o: {, B  p/ q8 X8 P{! r; [, ~7 d1 u, e% j
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! \& E! |0 [6 v) T: k$ r$ X$ b4 u! J, V0 [7 b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ }4 u- Y+ C# b0 k# v

8 r) s2 S6 A8 `5 B9 o( p; M        if(pshreRAM->packet_cout != count_copy)# K  W9 K% K: e
        {
" x. H+ z# y1 G: M                printf("a is %d\n", pshreRAM->a);
& N1 X# u$ w0 b                printf("b is %d\n", pshreRAM->b);
- B! f% W* {7 `: n) ~) K2 [- W                printf("count is %d\n", pshreRAM->packet_cout);! E8 x3 m+ F0 g; ~! B' ~- o( l
                count_copy = pshreRAM->packet_cout;, ]4 X% g5 d9 f
        }
* u' k$ |! C9 S* ^! a4 T        else( @. C6 G9 S3 J: P) ?1 {+ y
        {
, T* \$ t5 F5 I% ~8 w5 g! q, T                printf("No effective message!\n");/ H& w9 K5 x  G" N1 w
        }/ c2 z, u* Z$ [- H( B* h
}7 ~4 G, U9 M+ t1 B7 ^- D0 s  w. i

6 `: d, Y% a  B8 d+ _0 T* L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& z% F# H. C$ q* V% S) E
; ?# ]) V7 U  J  f/ b7 W
# x' K# @; N$ B7 N; U% O0 \7 b8 j/ e* V; d
7 |: H- U5 ^3 x0 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 06:36 , Processed in 0.040973 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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