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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 Z) {4 Y6 k, Q7 H9 N' B6 N6 j5 m- f9 `% X$ K5 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 a: _5 P# l, c2 x- D: o
#include <unistd.h>
6 {4 ]; \' ?& \#include <sys/mman.h>
, e1 O1 q9 z  C, Q#include <sys/types.h>
- N+ X$ N; a7 ^6 W- Q, U: Y#include <fcntl.h>4 N* }* E* o. Z" x
; a" h! D) C6 ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 J, \0 K5 T2 n
8 I; g/ S" y! d# `1 o
typedef struct. i( L; w5 k7 M5 \# n: q& D+ [8 e
{9 u( }' r! o1 \+ W3 U- V+ P
        unsigned int a;
# W( ?3 @* n0 c! o        unsigned int b;
/ u; R) ]4 u- J- K2 J0 |        unsigned int packet_cout;
3 a' k8 B% e1 j2 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! s% @' D& |& c+ L
6 P5 j1 {* S. ]+ k- mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 Y$ Y& Z2 Y# A) b" ?3 V0 s+ g6 hunsigned int count_copy = 0;
5 R4 x; o& |4 S; \2 }# x" `& t
) E2 }) \% W! d
( _" R; I0 ~0 Qint main(). c; V+ `) i4 [# F% X
{% N% k* I  n4 |( `- j
        pRX_MSG_PROTOCOL pshreRAM = NULL;% \5 S7 D! A% A0 Y; C& [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: v  Y( n* R5 P' I. C6 F0 z$ x% ]$ `% e7 X: B7 G4 ~
        while(1)
9 M" k$ }- w. x' o/ E        {& C2 r) J% q' d9 M
                read_MSG_buffer(pshreRAM);
- {$ z* v# f, Q- i3 H        }               
- x* `0 W8 ~$ F4 Y  \}5 S4 D/ b* V$ j: m% R
4 \& C0 r) d; ]3 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  V7 B1 D5 h% l, l+ U( g. ~% l9 E& {& d{5 f- Y; \9 c" c7 i* J9 o
        RX_MSG_PROTOCOL buf;
5 s6 S- ^& ]2 ^1 r$ p        
) i: n1 Z! Q! i4 s: z        buf.a = pshreRAM->a;7 j9 m8 D& v! D" L
        buf.b = pshreRAM->b;9 R* u) e4 p, ~3 h& d& ~) e
        buf.packet_cout = pshreRAM->packet_cout;
' n! N* S6 h6 L  q9 j        
8 @$ }& b, ~! _. P3 p+ |! |! M+ }        if(buf.packet_cout != count_copy)
8 W+ _6 ^; w2 [+ Q% L  }7 H. p( @: J        {
' G2 A, q0 L4 T* J1 o# S9 f& d                printf("a is %d\n", buf.a);. I% i6 q, K4 @
                printf("b is %d\n", buf.b);
& z; }7 q$ d0 ^+ e7 a5 F                printf("count is %d\n", buf.packet_cout);
9 W7 A% K5 K8 b6 P) q$ _: v1 q                count_copy = buf.packet_cout;2 e; \* G- G" ~  B9 v
        }1 z4 G/ z0 i3 L
        else
0 U2 N8 Q: p* q- q* r: {        {
# J+ O' R# v# S4 q! h                printf("No effective message!");
. g9 y  c* W# Y        }
+ x( R( Y/ D) {5 P}
( ^! u& G% F; a' h' S) B8 }8 N" \4 q2 R4 _5 O) o  r

2 P- `  u' p, W& b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% Z9 s, ]8 U- S# m2 d
使用下面代码,对内存使用了mmap函数后:( q* M8 m# M& |$ `5 E4 u7 i6 |
#include <stdio.h>) ?) g3 B8 H' y
#include <unistd.h>
5 ^) B  t' {& E" J( O  v' G#include <sys/mman.h>) Z/ B7 {0 A  m4 [
#include <sys/types.h>
' _5 L% s3 i0 P% S0 z& \1 s9 a#include <fcntl.h>
3 N) s9 T/ l5 D# G; u+ c1 t
$ C+ Q) U9 e5 _  v. k, B- @#define SHAER_RAM_BASE_ADDR    (0x80000000)3 s4 |8 P/ m7 ^- c, Q0 \
#define SHAER_RAM_SIZE         (0x20000)   
" A- p: i& L* I& k; D3 P% H9 y' Z
/ ^* R, w! r( n0 d" ^7 n5 ftypedef struct
. t7 u) q: V; \$ E0 Y1 i8 ~/ z* \{; D! D' ?9 x8 B* V+ M
        unsigned int a;
9 l/ |+ O4 K8 S0 q9 l- f        unsigned int b;
1 z$ r4 a# Z4 N* v) X/ I        unsigned int packet_cout;5 o4 A, s, B1 r& [/ T4 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! i& t6 M" `/ k; C2 J" h* d  {$ P" e4 |/ m+ a7 ^, V2 Y
void read_MSG_buffer(int *baseaddr);. w4 J9 B- H9 N& j: ~
unsigned int count_copy = 0;
* L/ [- R- j2 T% c9 {2 I4 q8 d( }: p6 p0 w! F
int main()9 ]. q5 k. `+ v: Z
{$ E: k" r4 S- H. j7 r
        int fd;, E: h( b+ F/ u- Y, X
        int *mem = NULL;
( h8 e. q' g& _' D* C
0 v3 n* N. E" a( k        if((fd = open("/dev/mem", O_RDWR)) <0)9 V& k8 y0 _: Q6 M
        {
/ z2 I; }1 R3 g' S. h# ?* a1 _                perror("open error");- H% h* v2 }! L5 B
                return -1;
/ Z! M; f# d, k0 r- m1 [9 l        }
0 ^5 N# W4 G# R4 r5 p: H        
8 l: V% O5 Q' J4 _( l( i# _0 I3 v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ P) n6 ?# H0 W1 G# \3 C
. v; K5 a/ {; _" I+ ?4 O: m
        while(1)
2 V7 g" k* g9 d) o        {
. R9 d' Z& _" E9 M# G+ p                read_MSG_buffer(mem);% A3 j  B/ H: L# |( i5 u/ u  t/ x
        }               
3 M( P8 f, }8 u1 a% z( G}
5 I; ?' A7 t1 R4 L* M7 j  h, h9 I) W3 m7 T4 G
void read_MSG_buffer(int *baseaddr)$ y8 {0 L6 j0 J1 E- o5 N
{7 S5 h; I  c' I% j+ o6 q5 m
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 K* S" h$ c% Q0 h  a

% m  z5 B9 P8 _1 d. S6 y+ a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 q) O: g1 Z2 u1 j; a: }1 V+ v) |: M0 E& E8 V4 k: z
        if(pshreRAM->packet_cout != count_copy)
3 x: }$ |& ?% e  _2 Z0 g, r7 Y        {; L; R6 t2 ^' {) y# O& K- _# Q1 G6 q
                printf("a is %d\n", pshreRAM->a);
: p& x: B) x; L1 {8 P                printf("b is %d\n", pshreRAM->b);0 a6 F7 z8 c4 d1 X& A
                printf("count is %d\n", pshreRAM->packet_cout);" ]/ U$ e! u# j) [6 ]$ ]
                count_copy = pshreRAM->packet_cout;
' i; a0 h7 t8 f6 S( z        }
. ?4 I# F! S+ I! {+ ~5 Z/ ]( Q        else
1 E- k: y6 @1 a+ ~5 V7 `8 ?& u        {; h% s. Q% K8 V' L/ H
                printf("No effective message!\n");; c) E8 s% f$ z, z3 F
        }
; B+ i% C0 }& U4 a$ r1 B& s}
2 U- ~1 \7 o- k) c3 B
( k( F+ g% H, O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ U+ {8 P" @0 N* J& h& D" n

0 o: W) P8 _6 |1 e) ]" Z
9 @) _0 n# J! ]1 A* |7 J: g4 _4 f- ?/ O. B+ |

) k: ]% @* x4 P7 y: Y7 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 03:18 , Processed in 0.040983 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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