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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# s, }" Y4 h  `2 g* B, e) d' L) I" {9 w: b* Z& U6 P, u4 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 w1 y) l1 J) v
#include <unistd.h>2 ]7 W4 k7 k( r# d9 @
#include <sys/mman.h>
; V4 @" m% f- {- p0 y#include <sys/types.h>0 ]' L% F7 d) N7 |  G( e+ R
#include <fcntl.h>+ ?1 t( _' Q3 C/ n7 O+ ~8 R4 c

+ e+ q# l7 e0 `' x#define SHAER_RAM_BASE_ADDR    (0x80000000)   & o; H4 n  p6 O: |' w) d* G

' d! [% R" F; }' S4 Ktypedef struct1 s  j' M  p  K1 E9 U) e
{
( C" W. L9 Y+ F4 Y* ]        unsigned int a;) Y6 d7 b. L3 m. P
        unsigned int b;
0 c" p8 H' T+ j        unsigned int packet_cout;" B4 S0 l' k2 Z. s; \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 W: s2 c# _! P  A
) r1 {# v$ h; |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& y! J6 y7 n* k" C! @! w) dunsigned int count_copy = 0;9 m/ t. U% C$ h; U+ A1 f9 b* N8 _& l  `' c

  [; b% R9 |6 w/ _" D$ g5 @/ m
' _* w5 n0 F0 d% N. _; w+ a( qint main()
& P( b. s2 y/ Y# F: J5 X1 r5 J{
( {$ K3 D6 v; e5 D: {) o        pRX_MSG_PROTOCOL pshreRAM = NULL;* a) h2 _1 }" K( i% {: H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ _& V3 ^; o5 a# l1 Y
1 g: p/ r+ }0 f* \% E9 ~& B3 b" A        while(1)! H, L7 w* I7 t; G) ]( b1 Y% n/ P
        {
% k) v& T7 U( K; _8 W% k: n                read_MSG_buffer(pshreRAM);
8 s0 L, N, O. L. O, p' G        }                ( `) s& [. E' S  n8 }) N0 O, i5 W
}
& n$ E6 ~9 f1 y7 c) d8 Y
) M! i, m$ s& @: y" S- J  Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 @  l1 d. O9 i5 ]. H{3 h+ Z7 C2 h; K% x/ W( `
        RX_MSG_PROTOCOL buf;
$ K% D3 ?$ d) h1 @5 z        
' l5 L6 _: E. E% y        buf.a = pshreRAM->a;* j3 H' ?8 ]' C9 N; f9 I! U8 i
        buf.b = pshreRAM->b;# p2 |; o+ U. z* X* S8 D
        buf.packet_cout = pshreRAM->packet_cout;
6 g" ?% p, X6 a# [: v7 ?8 N        " q& V3 v$ b0 M9 I$ ?9 Q% \
        if(buf.packet_cout != count_copy)
. M6 @) n" V5 x        {/ [( D$ D6 P6 j1 P4 Q
                printf("a is %d\n", buf.a);
, s2 X, c$ r1 v                printf("b is %d\n", buf.b);" ~7 z+ S" m2 ~% X+ {
                printf("count is %d\n", buf.packet_cout);
. V# q7 s* `2 \) W: n                count_copy = buf.packet_cout;) `1 K* r- Y8 V; z
        }0 {9 d- x6 D9 A' ?
        else: X4 v2 Z' f2 i! Y: N
        {
. y  Z- R8 d: D3 R2 M                printf("No effective message!");" b3 S6 M. M0 F4 _8 L" T. u; k3 C
        }
9 S& G0 }# c" Z3 H6 J. y; y}! J* e( i  _" H3 M8 o

3 [3 F+ G8 x7 P7 u' E& w0 ?0 a) M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% \4 Q3 ~- R# E7 S5 R使用下面代码,对内存使用了mmap函数后:! e5 c; g+ r, F2 v0 a
#include <stdio.h>& d1 \4 f7 E5 y( f8 K
#include <unistd.h>! ^- N4 \, d( Y8 k
#include <sys/mman.h>% t9 J) x- g& I% B
#include <sys/types.h>
, _# p# ]; t" s: M#include <fcntl.h>" T  G- l, j5 A# h

2 h8 @$ M/ f) P/ O5 S/ b+ }6 |. T0 w#define SHAER_RAM_BASE_ADDR    (0x80000000)( A+ V) L4 D1 G0 v, b- Y, Q
#define SHAER_RAM_SIZE         (0x20000)   6 N0 Y( Z* \4 ]8 X) o; U0 O
' N5 z: y# P1 c
typedef struct% y3 H2 ?$ {/ Y- Q( r; l0 J2 _
{$ j! R9 S- L; [( p8 `$ r. @; d
        unsigned int a;+ Q  C3 p! Q% \1 C- l! y
        unsigned int b;# k0 ?" e0 e3 H
        unsigned int packet_cout;
' U; T' x9 I* D1 @, Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 ?7 z0 J8 I, h0 L& J3 E3 L( X- ^
# z( W5 |- m5 X+ C$ T% wvoid read_MSG_buffer(int *baseaddr);
2 k( T9 T8 V# @0 b" \+ x- Iunsigned int count_copy = 0;
! S6 s) P8 x9 r' N3 E
4 p" m. s% D* [  y' |! |int main()6 K' `2 K$ {* C! q9 v5 @
{
8 y4 [9 N# ], D* |        int fd;2 R$ f% t+ D& p/ Y& Y, u& S6 p
        int *mem = NULL;( q! l0 h. C5 Y) c- e* I4 a

" K2 Z% [7 M  x0 K        if((fd = open("/dev/mem", O_RDWR)) <0)
8 @& d4 @5 ]/ {0 Y        {
( J" F4 m5 K2 U8 W5 i3 W                perror("open error");
2 ^7 Q) `: A9 f2 P; p                return -1;
" J2 O# F- o' B. D4 K        }
2 P1 W1 l  ?* C8 t9 d; n        
. n! _3 `0 H; M) n& U  F% ]! }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ?( H9 j1 @6 d' F
5 G) o: G5 e: ^2 r8 m! B  x% ^6 ?        while(1)
8 f3 T( T! H* b& p4 ]" n- [        {
) |& x5 Q% R3 {( e9 D5 S                read_MSG_buffer(mem);* k* ^) x& ^* \/ g  }" R( j
        }                * G- G6 j( _4 X; ~# M$ g
}5 @6 N  O# Q& F+ o# K
" U& a" p7 D3 }2 S* p
void read_MSG_buffer(int *baseaddr)
# G$ e2 u% ]3 D; C& |$ _" ]{' C- V3 L9 g8 J' h0 R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ R9 C% d2 J! C# C2 a0 C% |
+ R: w6 m7 q/ o- w' r# o5 `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 F. p5 \0 c2 R7 m$ Q: ~3 u$ ^3 R# \- h! _* v) u
        if(pshreRAM->packet_cout != count_copy)
  A3 b. R! X2 D/ R( l        {8 O" x/ L: \8 ~
                printf("a is %d\n", pshreRAM->a);" Z8 ^8 l6 J* z/ t9 o
                printf("b is %d\n", pshreRAM->b);! [2 [8 S1 c# Z+ T7 q3 f* X
                printf("count is %d\n", pshreRAM->packet_cout);9 s9 a4 L( a' u* r+ [* _
                count_copy = pshreRAM->packet_cout;
5 [# `! B  D( j% |5 R8 I8 y. c% E        }6 d0 ?. x# P/ Y6 q; y
        else5 l6 `0 t/ F7 @6 ?& E3 L) u
        {6 ~# n0 }3 o- F! s9 R' Y
                printf("No effective message!\n");9 x/ ]1 T* G! f  u- X3 l* o
        }$ P; U2 B$ M1 ]2 S, @9 V
}* I! R1 X& t* {5 a
7 L6 ]7 U% U  j- j- w% b- I+ ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. y% {, o+ T4 J- i

; A5 Z; d2 p5 O: F
! ?& d- m. T9 T6 X0 u4 W
9 a& C. B( C; W4 X- Y9 x
, E# c  K6 K5 o& h3 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 20:41 , Processed in 0.041087 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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