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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# ]2 @0 u& j2 e) o3 I0 y. n. R+ H% @) z/ z2 P4 P( }. l" O7 u" A  ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& f/ O! Q  R5 d#include <unistd.h>
8 @7 Y, W1 l* Y; j#include <sys/mman.h>
4 g* p8 _" [- c# L' }" S  f* G# p+ M#include <sys/types.h>
6 W; b/ ^, m( U. G% y; a0 v! _#include <fcntl.h>
6 ~) G1 Z3 J/ \0 X' @8 _) w2 v6 y5 {: Q' K+ l" x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# ~2 S) K) h: C$ I: u* A! i
' E  o( X/ a7 `" }: U7 o: w1 A0 Atypedef struct. h. u' d/ Z& l9 I
{
; @! I. q5 k2 I; I) J8 r5 x        unsigned int a;
9 ^4 s: t; V" q# b        unsigned int b;
% l. O" r* B& Z8 n. J5 g        unsigned int packet_cout;
% v3 Y: }( J# I/ o4 n! S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' c! f7 v* B" @2 o+ O; h4 s% x" V7 ?5 I& ?# z2 L$ [+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 {% |3 z/ }3 U( J  n# ]. U9 J+ ?' ounsigned int count_copy = 0;! z9 D7 }: q, O+ L* H

' G- e; F2 r  Q8 m
8 m% u- E( W5 I1 E, Y& g2 i" Bint main()8 u$ F( `6 N4 G% L( Q- U: o, i
{9 y- Z" Q3 X  |7 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;* {6 {# X- @6 ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) g; p. j  e2 V0 Z1 g
& [' w4 I- {& }
        while(1)
/ @4 y! }7 T6 }$ F( I0 r        {
1 \* `' M. h7 U+ g: d2 J$ K                read_MSG_buffer(pshreRAM);8 L3 F- P, q- D( t, u. c* m
        }                , }- x- x9 \# t, o
}
! X6 w; E  z! c8 t9 S) z3 B! b) l1 d0 ^3 a, i# H9 C: W9 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 b) ?- d2 Z* o9 K4 N
{
7 `* R6 \( _0 B1 D/ ~, M        RX_MSG_PROTOCOL buf;
& V% b+ A% D3 l( ?  S        ) m7 G$ o/ A7 M- V: N8 r) W$ G
        buf.a = pshreRAM->a;: g- @, ^& `2 [8 u% L
        buf.b = pshreRAM->b;
. v8 \/ l! S! d/ a* Y# z5 P        buf.packet_cout = pshreRAM->packet_cout;% r( E+ Z* ^; O! ^9 o
        
  z0 l7 t% O* j+ {        if(buf.packet_cout != count_copy)
/ \# K) U  j. L( D3 d8 m  {        {/ y2 P8 p* Y) F6 l5 D3 I1 I
                printf("a is %d\n", buf.a);
. L! F) L: u6 n  Z' ^8 K. k                printf("b is %d\n", buf.b);6 _4 v# N& N9 L# J9 ?
                printf("count is %d\n", buf.packet_cout);5 A7 h3 Q0 k0 l
                count_copy = buf.packet_cout;% [3 J: B/ [  u  V7 C
        }
9 d# ~0 }6 e4 X- l        else$ M1 Z; E1 I. H: Z) c7 C
        {& B; G- h: c8 c+ k% G+ [2 J
                printf("No effective message!");5 r  f+ Z3 z7 c' T4 `
        }1 S  |( M( V  Q$ T! b4 D
}  ?1 x2 o' B% L+ y+ G
) _" b5 F7 x. f, B

5 e' h' H. M0 S' |4 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- B- h: u* m8 F4 m
使用下面代码,对内存使用了mmap函数后:
3 K/ P$ k' V- @2 S#include <stdio.h>
% @  j5 ]7 h1 l' @, l$ O#include <unistd.h>
( v  s# K$ J) e- W2 U9 p/ Y' l* O8 O' l#include <sys/mman.h>" c/ Y) t1 {2 N" L
#include <sys/types.h>
. e* y$ s  {9 m. u: k3 m#include <fcntl.h>
. u/ G" i& T) i9 N* V1 v4 y) U/ M( V% z
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! T& w8 M7 x9 k& r0 P) N! h1 Z#define SHAER_RAM_SIZE         (0x20000)   
* z% R2 t  U* \$ c4 f
( T2 d' c7 Z" {9 A* G" Rtypedef struct) c# M* I4 H8 n2 c  ]
{! W! ?0 m% a8 E. @
        unsigned int a;
. f0 l* |* z1 x8 ~& a        unsigned int b;
9 X% G( Y- u7 ^, ^4 U        unsigned int packet_cout;8 K6 B# M5 `: B9 o0 ]  [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @! \  S7 \/ u% D9 N- E) ~3 z* s: |: n1 W% \1 j
void read_MSG_buffer(int *baseaddr);
* W, R7 z5 _; X5 ounsigned int count_copy = 0;
, M9 @5 g3 @0 c
  y! t% T1 U  D; v" \8 ]int main()
  Q' N3 s" P) H' l9 e' S{1 v+ x# _$ i' K9 F" Z
        int fd;6 A' H( z7 S! }; A
        int *mem = NULL;+ A1 x% ~. j6 n" m- }4 S, g

8 x# C0 W3 H/ |3 Z        if((fd = open("/dev/mem", O_RDWR)) <0)
, M# {  F" e. c! g; ?        {
2 e$ a6 l# r6 p/ |                perror("open error");/ k8 j2 [$ o7 h1 \) @8 `' B& J, G
                return -1;; r$ s8 I8 s. N7 Q5 J0 O
        }
% I1 E& p" _. \7 x3 I' l5 ~        ) X  @+ f6 h$ H3 `7 T- }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 F0 L8 N4 t6 ?
# g: b, }3 t% |. W6 O. H        while(1)* W' x2 l- E/ I; A' }6 s
        {
4 k- O; k" j, B* Y4 [                read_MSG_buffer(mem);) x% t5 Q" k4 b0 c2 N4 x2 Q+ U
        }                3 b$ I+ G+ `! a& b
}* P+ R5 z3 ~. A/ z$ H
5 e& H/ D2 S% _) P2 P
void read_MSG_buffer(int *baseaddr)/ q6 \1 C) U7 B8 ~6 P! m5 W
{0 _  R3 T/ ?. O" k
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 ]& L: g- b% h- V, r( R  U

4 ~8 d/ q9 h( |        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  f# |2 k  \4 I0 L

8 s2 n* H5 X3 J+ E' z  ^# Y        if(pshreRAM->packet_cout != count_copy)! L3 r0 _5 M0 v$ |' Y
        {
7 Y2 `) Z  Z# a' r5 l6 W* Z  P                printf("a is %d\n", pshreRAM->a);5 S" G7 d3 z" e1 n5 m
                printf("b is %d\n", pshreRAM->b);
' e$ C) l# B' j% t) c4 t                printf("count is %d\n", pshreRAM->packet_cout);
7 A: {8 _+ w3 i+ w  C! V- r                count_copy = pshreRAM->packet_cout;  ~: R$ P) a6 c7 L! X, o0 x1 i5 W. X
        }
  Y/ Y8 Y# B6 ~        else
" \& j: P- h4 Z7 {: r; E- j        {2 Q9 N6 o, g6 I' @6 c
                printf("No effective message!\n");# i* v- v: z4 A, k* H$ ~6 W4 S% M
        }7 w3 M, ?: I. l3 n9 B
}  X1 b2 m# l3 R% X6 `$ B; ~6 `
% x; h- ^# M# x0 q$ W( K& @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( s2 V2 x# N" K0 [$ r: N, G
; ]- b6 H) v5 r; }

, j: t0 |5 M5 m0 _, u7 Y- X3 _4 {2 ?2 R4 b( q
4 D* d7 K; E$ ~5 B/ W9 ?- g: j5 Z6 ]" B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 04:04 , Processed in 0.043577 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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