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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 V' k; |* R' d0 X2 a4 x# w

2 C4 i! u9 g  Y3 K( y$ `# p! D  EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* c% C/ W8 u* Z0 X#include <unistd.h>3 E; n# a: D2 y, N
#include <sys/mman.h>0 ]2 Z5 N( O$ X7 e( h9 P
#include <sys/types.h>
+ r- Z; }3 D6 z#include <fcntl.h>4 G2 b0 C. d6 ]* p! _  W4 y8 w$ u
+ p. K: r) O/ [+ V9 z4 c+ u, J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 b) l1 F) b, @3 A' u

# e4 f4 T0 P3 a% Ttypedef struct
% p/ G0 w" L( q1 h+ }{
8 _  u$ Y% p" d: D        unsigned int a;& |6 f, ~  ]2 w) {  n  K: T
        unsigned int b;
9 Y2 U( \6 I4 y; q  h        unsigned int packet_cout;
% P! @) |  E# Y  f& U/ g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! E& I2 h. p  Z5 L
" @; Y- N: Z* b+ i  E  m/ vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 b8 I/ Q; L3 C: Z2 Bunsigned int count_copy = 0;+ a! Z4 H: G; P% E& L2 r0 X5 R* Y- Z; [
7 K. G3 x4 R" m. {9 J

6 _' B5 E. L9 A$ x+ g. Hint main()
1 k$ l( }8 Q! u" t( Y& v) [{
( c* Y, s: Q9 M; n1 q3 n. a        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 a, @& v7 W) A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 m# c( Y& S' u3 M" |4 L2 P
# x, j! H- x$ ^        while(1)& q4 P/ Z% u1 m# k$ N9 x
        {3 C, c' r& }3 R3 I7 ^
                read_MSG_buffer(pshreRAM);0 E) J# `9 f3 X+ d
        }               
2 b$ a! v$ I* }2 F, L3 \6 Q}
) a' V" R& L7 u$ X) Y% g0 B' i  ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  H5 ^: N& r% T/ L# F8 P
{/ X# R+ ?* I1 g9 d, u1 c
        RX_MSG_PROTOCOL buf;
1 h5 d6 j* [0 S3 x2 r$ c: S        / v# O6 @) i/ f4 x! ?
        buf.a = pshreRAM->a;& `0 x' o4 _& M: L
        buf.b = pshreRAM->b;& m4 m- u/ C$ y# ]1 X7 \8 w
        buf.packet_cout = pshreRAM->packet_cout;6 W6 i# d$ g0 Y" B
        % O, j$ O4 s' J2 X
        if(buf.packet_cout != count_copy)
: A6 T3 }7 @  r4 D        {
, j% a1 S& Z3 ?5 C/ F                printf("a is %d\n", buf.a);
9 T9 A0 B8 v2 A3 H9 g* ]- `                printf("b is %d\n", buf.b);
/ D- H% V% _+ N- i3 R                printf("count is %d\n", buf.packet_cout);
: |0 f7 ^0 N; W* F& t5 ~                count_copy = buf.packet_cout;
1 w, Q9 n& p! v. R  M        }
/ l! y1 X% Y* {9 E: _        else
: a1 Y* z+ I5 s        {
) T0 y* Q3 n* M! m8 F5 z                printf("No effective message!");
; f+ j% @  a9 p0 ~& i        }' I! e- }" e9 ?5 x
}7 h6 o  J; q) D1 X
# |- a9 Q, c$ Q  ]4 e
( _: p. c1 K8 N! C+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ S% v9 j% Q+ w7 U6 A, s% J
使用下面代码,对内存使用了mmap函数后:# T8 w. Y$ J/ c5 g1 G2 Q
#include <stdio.h>
; m. \/ Q3 S. U" J+ S9 M- ~! s9 @+ T#include <unistd.h>
' W) G- B& Z5 x  t  t# g#include <sys/mman.h>
0 k  D# o3 I9 J( ?#include <sys/types.h>0 F$ V+ T' `, p# A9 n
#include <fcntl.h>
2 o6 M8 C& H( P) A* J% a, p; i; _" M/ K& J1 i# _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) ~- X9 P* f. S' R+ V6 Z#define SHAER_RAM_SIZE         (0x20000)   
* N: |" C; K4 ?7 Y6 t' A3 ?( W2 c/ O, a) G5 F/ k# s4 ^. l
typedef struct8 N& ~9 m2 W! j0 b  c+ I3 b0 b2 c
{9 M: q) i  v! [0 K1 K
        unsigned int a;$ \4 N) S; m- X- D6 a' z) P
        unsigned int b;/ A3 ~  V% u0 U( J* |" d
        unsigned int packet_cout;
/ W9 S+ ?/ z! n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! b0 w% c* s% t8 j) e
# J3 u' }% |8 Q) |
void read_MSG_buffer(int *baseaddr);
1 V  J# S- n5 q2 N  }& g* @7 ^1 uunsigned int count_copy = 0;
# y+ r; X' r; v% Z, j9 G- s: i. L6 ]3 t! O3 g+ M6 ]+ E9 u
int main()" e& R3 ^: m6 {% ^' G
{5 o5 `* `1 N. ^+ n7 s5 Y
        int fd;1 w8 P; p) p+ ]' A
        int *mem = NULL;! R8 H( _) P5 Z/ R" X' l

. l7 Z. ~# |4 N+ J1 I. B        if((fd = open("/dev/mem", O_RDWR)) <0)
3 m5 N7 {& ?  [. n1 w& @0 C' X        {
& j' {1 `/ L  i/ }: H3 ~                perror("open error");! s7 S0 m- k+ X  x* {
                return -1;
/ P' q3 |5 B# o' N$ R% E7 Z1 I: I        }
7 X* Y. ^6 Y3 F' P' w7 p        
% n- R6 @1 R' I' A- s/ y  w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- P4 A& M( e& o' ^8 M, p

) a* d/ O& C* n8 y        while(1)& c/ c; r7 X3 h, L5 h
        {$ Z7 b7 ]9 ~; w6 i+ g
                read_MSG_buffer(mem);. [2 d: w4 E% y' o) Q( P
        }               
( F* P/ e! _2 ]4 W4 H; @}
# F; U" A( X7 B4 S6 F5 e, M6 L& m; G/ ~! T' Z) |+ Z
void read_MSG_buffer(int *baseaddr)" r1 ^. e* p& f
{
+ D4 X/ K  n# U& p! M; y        pRX_MSG_PROTOCOL pshreRAM = NULL;5 X. Z) y8 j% n+ N! r

( U. j% U3 q( k: ^/ s* s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 U! v$ H$ `; E4 I! x: ^' U. K" e

0 V" l' X. M: D6 u6 [        if(pshreRAM->packet_cout != count_copy)
; Y. v( ~( [; }1 M3 I2 @* W9 [        {
6 w' j) r  N$ \! L& s5 }0 Z* G- y                printf("a is %d\n", pshreRAM->a);
) e/ I- r- q3 @8 \9 P                printf("b is %d\n", pshreRAM->b);
! z( H4 p% p- R& U4 a1 Z                printf("count is %d\n", pshreRAM->packet_cout);
, i( m% M1 B6 s                count_copy = pshreRAM->packet_cout;8 R' F$ L! G! M; w  z
        }
$ T3 v* y9 A9 i9 ~        else- `) _7 f1 e  x) E
        {
1 L9 F) o8 ]( G4 G8 w                printf("No effective message!\n");) w6 {1 E, k" e8 u( V1 r% E
        }  p8 o* i- X7 A) s3 z  {* a
}
% {& m6 L' G3 M8 }1 B# Z) w# d; y
/ B( M( I# P! m6 X, m1 k- A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 A* G3 J% E  N3 C5 @5 Y$ T
8 ^& @1 G7 q; V
- N' p4 r5 s6 g, [
7 f; |6 |; p0 P9 ^& P
6 h& q: J) E3 b, _* W3 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 12:08 , Processed in 0.040645 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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